现创建两个线程thread1和thread2,thread1运行时间短,thread2运行时间长,代码如下:
public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(() -> {//运行时间短for (int i = 0; i < 3; i++) {System.out.println("Thread1");try {sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread thread2 = new Thread(() -> {//运行时间长for (int i = 0; i < 3; i++) {System.out.println("Thread2");try {sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread1.start();thread2.start();for (int i = 0; i < 3; i++) {System.out.println("main");sleep(1000);}}
现有如下join顺序:
1.
thread1.join();
会使main线程阻塞,thread1与thread2同时运行,由于thread1运行时间短,则thread1会先结束,结束后thread2与main同时运行。
2.
thread2.join();
会使mian线程阻塞,thread1与thread2同时运行,thread1结束后,thread2依然在运行,thread2结束后main才会运行。
3.
thread1.join();thread2.join();
mian线程被阻塞,thread1与thread2先运行,thread1结束后thread2依然在运行,thread2结束后mian才运行。
4.
thread2.join();thread1.join();
main线程被阻塞,thread1与thread2先运行,由于thread1先于thread2结束,则thread2结束后“thread1.join()”是无效语句,mian接着运行。
以上3,4的写法与2是等价的