多線程之Thread.start和Thread.join

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章