1. 程式人生 > 其它 >多執行緒之間通訊

多執行緒之間通訊

如何進行多執行緒之間的通訊?

有一個原始笨方法就是線上程A中寫一個while迴圈,去判斷某個公共欄位flag是否符合條件,符合條件就往下執行。線上程B中特定方法執行完之後修改flag為true。但是這樣執行緒A一直監控公共欄位,會使記憶體佔用過高。

另一種方法就是使用執行緒的wait,notify來進行控制。線上程A執行前判斷flag是否符合條件,不符合就呼叫wait方法麻將執行緒A置為等待狀態,釋放鎖。執行緒B滿足條件時,呼叫notify方法,喚醒執行緒A。

public class ThreadA extends Thread{

private Object lock;

public ThreadA(Object lock) {
super();
this.lock = lock;
}

@Override
public void run() {
try {
synchronized (lock){
if(SynchronizedResource.getListSize()!=5){
System.out.println("池子還沒有滿,需要繼續等待生產"+System.currentTimeMillis());
lock.wait();
System.out.println("池子已經填滿,等待完成,執行後續操作"+System.currentTimeMillis());
}
}
}catch (InterruptedException e){
e.printStackTrace();
}

}
}








public class ThreadB extends Thread{

private Object lock;

public ThreadB(Object lock) {
super();
this.lock = lock;
}

@Override
public void run() {
try {
synchronized (lock){
for(int i=1;i<11;i++){
SynchronizedResource.putList(""+i);
System.out.println("已經添加了:"+i+"個數據");
if(SynchronizedResource.getListSize()==5){
lock.notify();
System.out.println("池子已經有5條資料,通知消費者消費"+System.currentTimeMillis());
}
Thread.sleep(2000);
}
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}







public class TestMain {

public static void main(String[] args) {
try {
Object lock = new Object();
ThreadA threadA = new ThreadA(lock);
threadA.start();
Thread.sleep(50);
ThreadB threadB = new ThreadB(lock);
threadB.start();
}catch (InterruptedException e){
e.printStackTrace();
}
}

}
控制檯輸出

 

 文章參考:https://www.cnblogs.com/hapjin/p/5492619.html