求助,java join 的原理

本贴最后更新于 976 天前,其中的信息可能已经东海扬尘

Thread 类中,join 方法的实现:

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

比如:

	public static void main(String[] args) throws InterruptedException {
		System.out.println(Thread.currentThread().getName() + " at begin ");
		Thread t1 = new Thread(new Runnable(){
			public void run() {
				System.out.println(" Thread t1 stats");
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("Thread t1 ends");
			}
		});
		
		t1.start();
		t1.join();// t1调用join();t1会wait(0),那么t1是如何让main线程等待的呢
		
		System.out.println(Thread.currentThread().getName() + " at end ");
	}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2633 引用 • 8034 回帖 • 772 关注
  • join
    6 引用 • 21 回帖
  • 线程
    99 引用 • 104 回帖 • 2 关注
  • 并发
    57 引用 • 63 回帖 • 1 关注
4 回帖
请输入回帖内容...
  • Vanessa

    不会 Java ,重新帮你排版了一下。是这个意思么?

    1 回复
  • gelvshi

    对的,我昨天复制过去之后,排版不太好搞.....又不想再手写一遍了,就乱着发了,谢谢 V 😬

    1 回复
  • Vanessa

    😄 也只能帮你到这了

  • gelvshi

    这个我明白了,之前是把 t 线程和 main 线程搞混了。要明确的是:t 的 join 方法是在 main 线程里调用的,所以对于 t 的 join 方法而言,当前线程是 main 线程。在 t.join();中,t 仅作为一个普通对象出现。
    说到底还是线程协作的关系,还是使用的 wait 和 notify