1. 程式人生 > >建立子父執行緒 保證一件事情 子執行緒執行三次後 父執行緒執行5次 如此迴圈十次

建立子父執行緒 保證一件事情 子執行緒執行三次後 父執行緒執行5次 如此迴圈十次

public class FatherAndSon{
    bokean flag=true;
     public synchronized void father(){
             //理當父執行緒不執行 wait():如果在一個執行緒 中呼叫了obj.wait():自己本身進入阻塞狀態    並釋放對鎖的佔有(立即釋放)
            // notify(): 喚醒執行緒(喚醒的是等待obj鎖的執行緒) 阻塞佇列---->Object的方法
        if(flag){    //判斷此時是子執行緒還是父執行緒進行執行,當flag的值是true時,父執行緒執行
            try {
                this.wait();    //當子執行緒進行執行時,通過呼叫wait方法使父執行緒阻塞
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int i=0;i<5;i++){    //父執行緒迴圈執行5次
            System.out.println("父執行緒第"+(i+1)+"次執行");
        }
        flag=true;    //轉換flag的值。使父線在執行五次之後進入阻塞狀態,不再執行父執行緒
        this.notify();    //通過呼叫notify方法喚醒正在阻塞的執行緒
    }


    //this FatherAndSon son=new FatherAndSon(); 物件是單例的
    public synchronized void sub(){
        if(!flag){    //判斷flag的值,當flag的值是false時,子執行緒執行
            //理當父執行緒不執行 wait():如果在一個執行緒 中呼叫了obj.wait():自己本身進入阻塞狀態並釋放對鎖的佔有(立即釋放)
            // notify(): 喚醒執行緒(喚醒的是等待obj鎖的執行緒) 阻塞佇列---->Object的方法
            try {
                this.wait();    //呼叫wait方法,使子執行緒進入阻塞狀態不再執行子執行緒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int i=0;i<3;i++){    //使子執行緒迴圈執行3次
            System.out.println("子執行緒第"+(i+1)+"次執行");
        }
        flag=false;    //重新賦予flag的值,使子執行緒在執行3次之後進入阻塞狀態,釋放同步鎖,讓父執行緒進行執行
        this.notify();    //呼叫notify方法喚醒阻塞中的執行緒
    }
}




public static void main(String[] args) {
            final FatherAndSon fs=new FatherAndSon();    //建立物件呼叫方法

            new Thread(new Runnable() {

                //JVM叫本地方法棧
                @Override
                public void run() {
                     //子執行緒的執行緒體
                    for (int i=0;i<10;i++)
                        fs.sub();
                }
            }).start();

            //父執行緒的執行緒體
            for(int i=0;i<10;i++)
                fs.father();
    }

}