主線程與子線程的執行問題


主線程與子線程是按照什么規則執行的呢?

經過我的反復試驗,終於領略到了它們執行的秘密。

一.程序先從主線程開始執行(main為主線程入口)。當遇到star()方法時,開啟多線程模式。此時子線程與主線程交替執行。如果在主線程方法后開啟線程,則要等主線程先執行完再執行主線程后面的子線程。

下面來舉幾個栗子。

public class Demo01_CreatTread {
    public static void main(String[] args) throws InterruptedException {
        MyTread myTread1=new MyTread("線程1");
        MyTread myTread2=new MyTread("線程2");
        myTread1.start();
        myTread2.start();
        System.out.println("mainTread");
    }
}
//這個代碼為先輸出主線程、子線程1、子線程2交替執行。因為main為線程入口,所以主線程一般更有可能第一時間搶占到資源,所以一般來說先打印"mainTread"。
public class Demo01_CreatTread {
    public static void main(String[] args) throws InterruptedException {
        MyTread myTread1=new MyTread("線程1");
        MyTread myTread2=new MyTread("線程2");
        myTread1.start();
        for(int i=0;i<10;i++) {
            System.out.println("mainTread"+i);
        }
        myTread2.start();
    }
}
//MyTread1和主線程先交替執行,等主線程執行后,MyTread1與MyTread2再交替執行。

 二.join()方法

Thread類中的join方法的主要作用就是同步,它可以使得線程之間的並行執行變為串行執行。

public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        t1.start();
        /**join的意思是使得放棄當前線程的執行,並返回對應的線程,例如下面代碼的意思就是:
         程序在main線程中調用t1線程的join方法,則main線程放棄cpu控制權,並返回t1線程繼續執行直到線程t1執行完畢
         所以結果是t1線程執行完后,才到主線程執行,相當於在main線程中同步t1線程,t1執行完了,main線程才有執行的機會
         */
        t1.join();
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<1000;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}

上面程序結果是先打印完小明線程,在打印小東線程;  

上面注釋也大概說明了join方法的作用:在A線程中調用了B線程的join()方法時,表示只有當B線程執行完畢時,A線程才能繼續執行。

大概規則為:先執行加入join()方法的線程,然后再按照一中的規則執行。

public class Demo01_CreatTread {
    public static void main(String[] args) throws InterruptedException {
        MyTread myTread1=new MyTread("線程1");
        MyTread myTread2=new MyTread("線程2");
        myTread1.start();
        myTread1.join();
        myTread2.start();
        System.out.println("mainTread");
    }
}
//先執行MyTread1,再輸出mainTread,然后執行MyTread2.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM