Java中线程join()方法可以保证线程的顺序执行,如有三个线程A,B,C,我们在不使用join()方法的情况下,执行的顺序是不固定的。
如果我们使用join()方法可以让A线程执行完成后再执行B线程,B线程执行完成后,再执行C线程。
线程join()方法的定义:
public final synchronized void join(long millis, int nanos);
public final void join() throws InterruptedException;
public final synchronized void join(long millis);
1)不使用join的方法,我们可以参考之前的例子 继承Thread类 创建线程。
输出的结果如下:
线程名Thread-0,次数(4)
线程名Thread-1,次数(4)
线程名Thread-0,次数(3)
线程名Thread-1,次数(3)
线程名Thread-0,次数(2)
线程名Thread-1,次数(2)
线程名Thread-0,次数(1)
线程名Thread-1,次数(1)
线程名Thread-0,次数(0)
线程名Thread-1,次数(0)
线程名Thread-1,次数(4)
线程名Thread-0,次数(3)
线程名Thread-1,次数(3)
线程名Thread-0,次数(2)
线程名Thread-1,次数(2)
线程名Thread-0,次数(1)
线程名Thread-1,次数(1)
线程名Thread-0,次数(0)
线程名Thread-1,次数(0)
线程1和线程2是交错执行的。
2)下面使用Join()方法让线程顺序执行。
public class MyThreadTask extends Thread {
private int count = 5;
@Override
public void run() {
while(count-- >0)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程名" + this.getName() + ",次数(" + count + ")");
}
}
public static void main(String[] args) throws InterruptedException {
MyThreadTask task1 = new MyThreadTask();
MyThreadTask task2 = new MyThreadTask();
task1.start();
task1.join();
task2.start();
}
}
输出结果如下:线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
线程名Thread-1,次数(4)
线程名Thread-1,次数(3)
线程名Thread-1,次数(2)
线程名Thread-1,次数(1)
线程名Thread-1,次数(0)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
线程名Thread-1,次数(4)
线程名Thread-1,次数(3)
线程名Thread-1,次数(2)
线程名Thread-1,次数(1)
线程名Thread-1,次数(0)
我们看到线程1执行完成后才会执行线程2。