Java 理解join()方法示例
Java thread join()方法让我有点困惑。我有下面的例子Java 理解join()方法示例,java,multithreading,Java,Multithreading,Java thread join()方法让我有点困惑。我有下面的例子 class MyThread extends Thread { private String name; private int sleepTime; private Thread waitsFor; MyThread(String name, int stime, Thread wa) { … } public void run() { System.out.pri
class MyThread extends Thread {
private String name;
private int sleepTime;
private Thread waitsFor;
MyThread(String name, int stime, Thread wa) { … }
public void run() {
System.out.print("["+name+" ");
try { Thread.sleep(sleepTime); }
catch(InterruptedException ie) { }
System.out.print(name+"? ");
if (!(waitsFor == null))
try { waitsFor.join(); }
catch(InterruptedException ie) { }
System.out.print(name+"] ");
及
线程的终止顺序是什么 它将按顺序t1、t2、t3、t4终止。。。join会导致当前正在执行的线程等待它被调用的线程终止。关于
thread.join()
,究竟是什么让您感到困惑?你没有提到任何具体的事情
假设Thread.join()
(as),等待该线程死亡,那么t4
将等待t3
完成,这将等待t2
完成,这将等待t1
完成
因此,t1
将首先完成,然后是t2
,t3
,和t4
,有一个主线程,它启动您创建的四个自定义线程t1、t2、t3和t4。现在,如果在线程上调用join()方法,并且没有提供任何参数(time)(默认情况下为0,表示最大等待时间是永久的),那么调用线程将等待调用join的线程终止
调用t1.start()时,JVM将调用相应的run()方法。由于t1的waitsFor参数为null,它将通过打印其名称来终止。由于您正在添加睡眠t2、t3、t4,因此在t1完成其睡眠时将启动。现在t2将等待t1终止,因为我们正在从t2调用t1上的join。同样,t3将等待t2,t4将等待t3。因此,您的执行将转到t1->t2->t3->t4
但是,如果t1在t2调用join之前终止,join将简单地返回,因为此时(t2调用t1上的join时)isAlive()
将为false
这里线程终止的顺序肯定是t1、t2等等。也许你会从这里对java线程中的join()方法有一个清晰的了解,这是一个技巧性的问题吗?还是家庭作业?:)读了一些电子书,发现这个例子,实际上执行线程等待调用连接的线程完成,也许我今天应该退出:DWaits等待线程死亡@Giacomo,没错,这就是为什么我在任何人注意到(几乎无论如何;)waitsFor=wa
构造函数内部之前删除了它。
public class JoinTest2 {
public static void main (String [] args) {
Thread t1 = new MyThread("1",1000,null);
Thread t2 = new MyThread("2",4000,t1);
Thread t3 = new MyThread("3",600,t2);
Thread t4 = new MyThread("4",500,t3);
t1.start();
t2.start();
t3.start();
t4.start();
}
}