join原理:

join的底层使用到了保护性暂停的设计模式

源码:

  1. public final synchronized void join(long millis)
  2. throws InterruptedException {
  3. //记录最初时间
  4. long base = System.currentTimeMillis();
  5. //记录已经经历的时间
  6. long now = 0;
  7. //传入的时间小于0,抛异常
  8. if (millis < 0) {
  9. throw new IllegalArgumentException("timeout value is negative");
  10. }
  11. //等于0就是一直等待,调用wait(0)
  12. if (millis == 0) {
  13. while (isAlive()) {
  14. wait(0);
  15. }
  16. } else {
  17. while (isAlive()) {
  18. //delay表示传入的参数减去已经经历的时间,小于0就结束
  19. long delay = millis - now;
  20. if (delay <= 0) {
  21. break;
  22. }
  23. //将delay设置为参数,防止唤醒错误的问题
  24. wait(delay);
  25. //判断已经经历的时间
  26. now = System.currentTimeMillis() - base;
  27. }
  28. }
  29. }

保护性暂停的设计模式:

1646895418198.png