线程连接本身

时间:2011-05-14 03:18:16

标签: java multithreading join

我有疑问,当线程加入时会发生什么。即线程自己调用join方法。我没有收到任何错误。

示例:

public class JoinItself extends Thread {

    public void run() {
        System.out.println("Inside the run method ");
        System.out.println(Thread.currentThread().isAlive());
        for(int i=0;i<5;i++) {
            try {
                System.out.println("Joining itself ...");
                Thread.currentThread().join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {

        JoinItself j = new JoinItself();

        System.out.println(j.isAlive());
        j.start();
        System.out.println(j.isAlive());
        System.out.println("Thread started ...");

    }

}

但为什么?我应该收到任何错误吗?

4 个答案:

答案 0 :(得分:33)

线程连接本身的概念没有意义。

join()方法使用isAlive()方法 确定何时从join()方法返回。在目前的实施中,它也 不检查线程是否正在加入 换句话说,join()方法返回当且仅当线程不再存在时。这将产生影响 永远等待。

答案 1 :(得分:2)

  

我应该收到任何错误吗?

我不希望出现错误。 Thread.join()的{​​{3}}并没有说这是一个错误,只是可以想象一些疯狂的人可能会将此作为另一种方式来执行sleep,所以一个无证错误会是个坏主意。

我想Sun并不认为这是一个值得特别关注的案例。

答案 2 :(得分:0)

联接等待来自另一个线程的通知。在这种情况下,同一线程正在等待自身通知,因此没有收到通知。该程序将永远不会结束。

答案 3 :(得分:0)

我们可以检查join()源代码:

public final void join() throws InterruptedException {
    join(0);
}
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 final synchronized void join(long millis, int nanos)
throws InterruptedException {
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }
    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }
    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }
    join(millis);
}

这取决于您如何加入自己的线程和alive()方法
希望这个帖子可以清楚 Quick start Java Thread join