執行緒初步(五)---join,yield
阿新 • • 發佈:2019-02-17
今天我們來學習一下執行緒裡面的兩個方法
一、join();
join方法:等待執行緒終止。
使用方法 執行緒名.join();
表示的是當前執行緒加入,當新加入的執行緒加入,原先的執行緒才會開始執行,接下來我們寫一個小程式來演示一下
/**
* 本次程式主要是瞭解執行緒中join方法
* join();等待執行緒終止
* @author lover
*
*/
class JoinDemo implements Runnable{
public void run(){
for(int i=0;i<=20;i++){
System.out.println(Thread.currentThread().getName()+"-------->" +i);
}
}
}
public class ThreadJoinDemo {
public static void main(String[] args) {
JoinDemo t=new JoinDemo();
//JoinDemo t2=new JoinDemo();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try {
t1.join();//使用join方法,使t1加入,main主執行緒會在t1結束時才會執行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
for(int k=0;k<=20;k++){
System.out.println("main----->"+k);
}
}
}
我們在t1執行緒開始時使用join方法。當主執行緒讀到join方法時,主執行緒釋放執行權,會等t1執行結束後才會執行。和t2爭奪執行權交替執行。我們來看一下結果
Thread -0-------->0
Thread-0-------->1
Thread-0-------->2
Thread-0-------->3
Thread-0-------->4
Thread-0-------->5
Thread-0-------->6
Thread-0-------->7
Thread-0-------->8
Thread-0-------->9
Thread-0-------->10
Thread-0-------->11
Thread-0-------->12
Thread-0-------->13
Thread-0-------->14
Thread-0-------->15
Thread-0-------->16
Thread-0-------->17
Thread-0-------->18
Thread-0-------->19
Thread-0-------->20
main----->0
Thread-1-------->0
main----->1
Thread-1-------->1
main----->2
Thread-1-------->2
main----->3
Thread-1-------->3
Thread-1-------->4
Thread-1-------->5
Thread-1-------->6
main----->4
Thread-1-------->7
main----->5
Thread-1-------->8
main----->6
Thread-1-------->9
main----->7
Thread-1-------->10
main----->8
Thread-1-------->11
main----->9
Thread-1-------->12
main----->10
Thread-1-------->13
main----->11
Thread-1-------->14
main----->12
Thread-1-------->15
main----->13
Thread-1-------->16
main----->14
Thread-1-------->17
main----->15
Thread-1-------->18
main----->16
Thread-1-------->19
main----->17
Thread-1-------->20
main----->18
main----->19
main----->20
如果我們將t1.join方法放在t2.start();之後,將會出現,剛開始t1與t2開始執行,等t1執行結束後,main主執行緒開始執行。
二、yield
yield();:暫停當前正在執行的執行緒物件,並執行其他執行緒。
解釋:當前執行緒釋放執行權,執行權再次隨機的切到包括它自己在內的其他執行緒
我們來看一個例子
/**
* 本次程式我們來了解yield();方法
* 暫停當前正在執行的執行緒物件,並執行其他執行緒。
* @author lover
*
*/
class YieldDemo implements Runnable{
public void run(){
for(int i=0;i<=20;i++){
System.out.println(Thread.currentThread().getName()+"------>"+i);
Thread.yield();
}
}
}
public class ThreadYieldDemo {
public static void main(String[] args) {
YieldDemo t=new YieldDemo();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
for(int k=0;k<=20;k++){
System.out.println("main------->"+k);
}
}
}
當執行緒執行到yield方法時,該執行緒將釋放執行權,此時三個執行緒爭奪執行權,我們來看下結果
main------->0
Thread-1------>0
Thread-0------>0
Thread-1------>1
main------->1
Thread-1------>2
Thread-0------>1
Thread-1------>3
main------->2
Thread-1------>4
Thread-0------>2
Thread-1------>5
main------->3
Thread-1------>6
Thread-0------>3
Thread-1------>7
main------->4
Thread-1------>8
Thread-0------>4
Thread-1------>9
main------->5
Thread-1------>10
Thread-0------>5
Thread-1------>11
main------->6
Thread-1------>12
Thread-0------>6
Thread-1------>13
main------->7
Thread-1------>14
Thread-0------>7
Thread-1------>15
main------->8
Thread-1------>16
Thread-0------>8
Thread-1------>17
main------->9
Thread-1------>18
Thread-0------>9
Thread-1------>19
main------->10
Thread-1------>20
Thread-0------>10
main------->11
Thread-0------>11
main------->12
Thread-0------>12
main------->13
Thread-0------>13
main------->14
Thread-0------>14
main------->15
Thread-0------>15
main------->16
Thread-0------>16
main------->17
Thread-0------>17
main------->18
Thread-0------>18
main------->19
Thread-0------>19
main------->20
Thread-0------>20
以上就是執行緒join和yield方法