Thread.start;//是開啓線程
Thread.join;//邀請A線程先執行,本線程先暫停執行,等待(可設置等待時間)A線程執行完後,主線程再接着往下執行
自我理解:
當Thread.join後,即這個子線程會獲得執行權,主線程會等這個子線程執行完再執行
(如果join設置了時間,超過時間還沒有執行完,主線程就不會再等了,主線程會繼續執行)
直白話:
一個女的和男朋友一起約定去看電影,突然男朋友臨時有事,就相當於開了一個子線程去忙其他的了,女的則跟他
約定,就等你××分鐘,如果在××分鐘內趕到,我們則馬上進場,如果××分鐘後還沒有趕到,我就自己進去了。
執行順序:
只有線程開啓了,才能將線程加入到調用隊列等待調用。否則線程都還沒有開啓,怎麼邀請調用。
所以先Thread.start,再Thread.join。
栗子1:不設置join時間
package com.demo;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Author by mocar小師兄
* @Date 2020/3/13 11:22
**/
public class ThreadJoinTest {
private static class FirstTask implements Runnable{
@Override
public void run() {
System.out.println("FirstTask\t 執行任務開始");
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("FirstTask\t 執行任務結束");
}
}
private static class SecondTask implements Runnable{
@Override
public void run() {
System.out.println("SecondTask\t 執行任務開始");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("SecondTask\t 執行任務結束");
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new FirstTask());
Thread thread2 = new Thread(new SecondTask());
System.out.println("主線程開始執行");
thread1.start();
thread2.start();
thread2.join();
//TimeUnit.SECONDS.sleep(3);
System.out.println("主線程執行結束");
}
}
結果顯示:
主線程等join子線程執行完才繼續執行
栗子2:join子線程設置時間且超過了設置時間
package com.demo;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Author by mocar小師兄
* @Date 2020/3/13 11:22
**/
public class ThreadJoinTest {
private static class FirstTask implements Runnable{
@Override
public void run() {
System.out.println("FirstTask\t 執行任務開始");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("FirstTask\t 執行任務結束");
}
}
private static class SecondTask implements Runnable{
@Override
public void run() {
System.out.println("SecondTask\t 執行任務開始");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("SecondTask\t 執行任務結束");
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new FirstTask());
Thread thread2 = new Thread(new SecondTask());
System.out.println("主線程開始執行");
thread1.start();
thread2.start();
thread2.join(2);
//TimeUnit.SECONDS.sleep(3);
System.out.println("主線程執行結束");
}
}
結果顯示:
join子線程超時,主線程將不會等待,將執行其他子線程或main主線程
參考:
https://www.jianshu.com/p/b64c16c45e8f