Java多線程消費者、生產者的基本思路
阿新 • • 發佈:2019-02-12
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多線程消費者、生產者的基本思路