基於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...