執行緒間通訊的方式

2021-09-27 04:09:54 字數 3121 閱讀 5805

基於volatile關鍵字來實現執行緒間相互通訊是使用共享記憶體的思想,就是讓這個變數對所有執行緒都可見,一旦發生變化,都是立即可見的。

public class testsync  catch (interruptedexception e) 

if (list.size() == 5)

notice = true;

}});

// 實現執行緒b

thread threadb = new thread(() ->

}});

// 需要先啟動執行緒b

threadb.start();

try catch (interruptedexception e)

// 再啟動執行緒a

threada.start();}}

object類提供了執行緒間通訊的方法:wait,notify,notifyall

注意:wait和notify必須在synchronized內使用,wait釋放鎖,notify喚醒執行緒,等synchronized執行完自動釋放鎖。

public class testsync  catch (interruptedexception e) 

if (list.size() == 5)

lock.notify();// 喚醒b執行緒,此時b被喚醒,但執行緒a並不立即釋放物件lock的鎖,而是執行完synchronized的語句,才自動釋放鎖。}}

});// 實現執行緒b

thread threadb = new thread(() -> catch (interruptedexception e)

}system.out.println("執行緒b收到通知,開始執行自己的業務...");}}

});// 需要先啟動執行緒b

threadb.start();

try catch (interruptedexception e)

// 再啟動執行緒a

此時b被喚醒,但執行緒a並不立即釋放物件lock的鎖,而是執行完synchronized的語句,才自動釋放鎖。

countdownlatch(count)基於aqs框架,相當於維護了乙個執行緒間共享變數state,當呼叫latch.await()方法要求主線程等待所有count個檢查任務全部準備好才一起並行執行。latch.countdown();方法作用是通知countdownlatch有乙個執行緒已經準備完畢,倒計數器可以減一了。當計數器減到0時,所有執行緒再一起啟動執行。

public class testsync  catch (interruptedexception e) 

if (list.size() == 5)

countdownlatch.countdown();

}});

// 實現執行緒b

thread threadb = new thread(() -> catch (interruptedexception e)

}system.out.println("執行緒b收到通知,開始執行自己的業務...");

break;

}});

// 需要先啟動執行緒b

threadb.start();

try catch (interruptedexception e)

// 再啟動執行緒a

threada.start();}}

結果:

這個方法跟第二種相似,lock代替了同步方法或同步**塊,condition代替了同步監視器的功能,await=wait,signal = notify。

public class testsync  catch (interruptedexception e) 

if (list.size() == 5)

condition.signal();

}lock.unlock();

});// 實現執行緒b

thread threadb = new thread(() -> catch (interruptedexception e)

}system.out.println("執行緒b收到通知,開始執行自己的業務...");

lock.unlock();

});threadb.start();

try catch (interruptedexception e)

threada.start();}}

結果:

a在喚醒操作之後,並不釋放鎖。這種方法跟 object 的 wait() 和 notify() 一樣。要等lock.unlock()釋放鎖之後,b才執行。

locksupport 是一種非常靈活的實現執行緒間阻塞和喚醒的工具,使用它不用關注是等待執行緒先進行還是喚醒執行緒先執行,但是得知道執行緒的名字。

public class testsync 

system.out.println("執行緒b收到通知,開始執行自己的業務...");

});// 實現執行緒a

thread threada = new thread(() -> catch (interruptedexception e)

if (list.size() == 5)

locksupport.unpark(threadb);

}});

threada.start();

threadb.start();}}

結果:

blockingqueue介面主要作為執行緒同步的工具。當生產者試圖向blockingqueue中放入元素,如果佇列已滿,則執行緒被阻塞;當消費者試圖向blockingqueue中取出元素時,若該佇列已空,則執行緒被阻塞。

程序間通訊的方式?執行緒間通訊的方式?

管道 命名管道 訊號量 訊息佇列 訊號及共享記憶體只適用於本地程序間通訊,套接字則可用於遠端通訊,因而一般用於網路程式設計。部分概念解釋 匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。命名管道是一種實際存在的fifo檔案,稱作...

執行緒間通訊方式

執行緒間通訊方式 收藏 執行緒間通訊可以通過下列三種方法 1 使用全域性變數實現執行緒間通訊 2 使用訊息實現執行緒間通訊 3 使用cevent類實現執行緒間通訊 使用全域性變數實現執行緒間通訊 定義乙個全域性變數,不同的執行緒間可以通過修改全域性變數的值來進行通訊。例如 定義乙個控制線程的全域性變...

執行緒間通訊的方式

鎖機制 包括互斥鎖 條件變數 讀寫鎖 互斥鎖提供了以排他方式防止資料結構被併發修改的方法。讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。條件變數可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。訊號量機制 semapho...