多線程主要考察的就是 線程的同步控制 生產者消費者的思路就是,當 一個線程執行時讓另外一個線程 掛起就好了多線程
ThreadOne、ThreadTwo同時運行,添加一個變量在一個公共類(下邊的Function類)中,ide
例如:當變量爲true,ThreadOne執行ThreadTwo掛起;this
當變量爲false,ThreadOne掛起ThreadTwo執行spa
一個線程執行完以後,本身重置變量(目的是把本身掛起),而後喚醒另外一個掛起的線程,如此即可使兩個線程交替執行線程
對於消費者、生產者來講:code
當消費者拿不到東西的時候就把本身掛起,而且喚醒生產者就能夠了blog
當生產者生產完東西的時候就把本身掛起,而且喚醒消費者就能夠了同步
//這是一個共享的類,主線程和子線程共用
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(); } } }