我有疑问,当线程加入时会发生什么。即线程自己调用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 ...");
}
}
但为什么?我应该收到任何错误吗?
答案 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