1. 程式人生 > >Java多線程消費者、生產者的基本思路

Java多線程消費者、生產者的基本思路

func don 判斷 this 定義 oid final zed ()

多線程主要考察的就是 線程的同步控制 生產者消費者的思路就是,當 一個線程執行時讓另一個線程 掛起就行了

ThreadOne、ThreadTwo同時運行,添加一個變量在一個公共類(下邊的Function類)中,

例如:當變量為true,ThreadOne執行ThreadTwo掛起;

當變量為false,ThreadOne掛起ThreadTwo執行

一個線程執行完之後,自己重置變量(目的是把自己掛起),然後喚醒另一個掛起的線程,如此便可使兩個線程交替執行

對於消費者、生產者來說:

當消費者拿不到東西的時候就把自己掛起,並且喚醒生產者就可以了

當生產者生產完東西的時候就把自己掛起,並且喚醒消費者就可以了

//這是一個共享的類,主線程和子線程共用
    class Function{
        private boolean flag=false;
        //子線程要實現的功能
        public synchronized void sub(){
            while(flag){  //此處用while循環而不是用if語句判斷是為了防止 線程的假喚醒
                try {
                    this.wait(); //此處的this指的是當前執行此段代碼的線程
}
catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<10;i++){ //for循環內定義子線程的功能,這裏簡單的假設為打印一句話,主線程同理 System.out.println("sub"+i); } flag=true;
this.notify(); } //主線程要實現的功能 public synchronized void main(){ while(!flag){ //此處用while循環是為了 防止線程的假喚醒 try { this.wait(); //此處this指的是當前執行此段代碼的線程 } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<10;i++){ System.out.println("main"+i); } flag=false; this.notify(); } } public class Demo01 { public static void main(String[] args) { final Function f=new Function(); new Thread( new Runnable(){ @Override public void run() { for(int i=0;i<50;i++){ f.sub(); } } } ).start(); for(int i=0;i<50;i++){ f.main(); } } }

Java多線程消費者、生產者的基本思路