JAVA中提供了一些方法用來控制線程的執行。
1、join方法:由Thread提供,作用:讓一個線程等待另一個線程完成的方法。a線程中調用b線程的join方法,那麼a線程將被阻塞,直到b線程執行完畢。
public class JoinThread extends Thread{
public JoinThread(String name){
super(name);
}
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args) throws InterruptedException{
new JoinThread("新線程").start(); //啓動子線程
for(int i=0;i<100;i++){
if (i==20) {
JoinThread jt=new JoinThread("被Join的線程");
jt.start();
jt.join();//main線程調用了jt線程的join方法,main線程必須等到jt執行結束後才能繼續向下執行
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
上述代碼中,總共有三個線程,main,線程1、線程2,在i=20時,由於main線程中調用了線程2的join方法,所以main線程進入阻塞狀態,只有線程1和線程2會被執行。因此輸出結果爲
- .........
- 被Join的線程 93
- 被Join的線程 94
- 被Join的線程 95
- 被Join的線程 96
- 被Join的線程 97
- 被Join的線程 98
- 被Join的線程 99
- main 20
- main 21
- main 22
- main 23
- main 24
- main 25
- ........
2、後臺線程:後臺線程(Daemon Thread)的任務:爲其他線程服務。例如:JVM的垃圾回收器。特徵:如果所有的前臺線程死亡,後臺線程會自動死亡。設置的方法:通過調用Thread對象的setDaemon(true)方法可以把一個線程設置爲後臺線程。
public class DaemonThread extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args){
DaemonThread dt=new DaemonThread();
dt.setDaemon(true); //設置爲後臺線程,後臺線程的一個重要特徵:所有前臺線程都死亡,這個後臺線程纔會死亡。
dt.start();
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
3、sleep:作用:讓當前正在執行的線程暫停一段時間,並進入阻塞狀態。調用方法:Thread.sleep(long millis)。還有一種調用方法精確到毫微秒,很少用。
public class SleepTest {
public static void main(String[] args) throws InterruptedException{
for(int i=0;i<10;i++){
System.out.println("當前時間"+new Date());
Thread.sleep(1000); //當前只有只有一個主線程,暫停該線程1秒。結果爲每秒輸出一個字符串,顯示當前時間
}
}
}
4、yield:作用;線程讓步,也是Thread中的一個靜態方法,讓當前線程進入就緒狀態,而不是阻塞狀態,相當於通知系統的線程調度器,你重新進行一次調度。而實際上,當某個線程被yield暫停之後,只有優先級與當前線程相同或者比當前優先級更高的線程才能獲得執行的機會。
5、線程的優先級:每個線程都有一定的優先級,優先級高的線程獲得更多的機會,低的獲得較少的機會。這並不是說,a的優先級比b高,b一定要在a執行完才能執行,而是a線程執行的概率更大一些,至於怎麼樣執行,仍有線程調度器來決定。