主線程與子線程是按照什么規則執行的呢?
經過我的反復試驗,終於領略到了它們執行的秘密。
一.程序先從主線程開始執行(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.
