1. 程式人生 > >執行緒初步(五)---join,yield

執行緒初步(五)---join,yield

今天我們來學習一下執行緒裡面的兩個方法
一、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方法