我有兩個線程的應用程序,一個寫入隊列,另一個讀取異步。 我需要創建第三個生成20多個。 新創建的線程將運行直到明確停止。那20個線程應該獲得「實時」數據以分析它。 每個20都有一個唯一的ID /名稱。我需要將相關數據(即READ線程收集)發送到正確的線程(20個線程)。例如如果數據包含一個id爲2的字符串 - >我需要將它發送到ID = 2的線程。 我的問題是:我應該如何爲20個線程中的每一個持有一個「指針」並將相關數據發送給它? (我可以搜索可運行列表中的id(這將保持線程) - >但是然後我需要調用一個方法「NewData(string)」來將數據發送到正在運行的線程)。 我該怎麼做? TIA PazJava多線程消息傳遞
回答
您可能會更好地使用隊列與您的線程進行通信。然後,您可以將所有隊列放入地圖中以便於訪問。我會推薦一個BlockingQueue
。
public class Test {
// Special stop message to tell the worker to stop.
public static final Message Stop = new Message("Stop!");
static class Message {
final String msg;
// A message to a worker.
public Message(String msg) {
this.msg = msg;
}
public String toString() {
return msg;
}
}
class Worker implements Runnable {
private volatile boolean stop = false;
private final BlockingQueue<Message> workQueue;
public Worker(BlockingQueue<Message> workQueue) {
this.workQueue = workQueue;
}
@Override
public void run() {
while (!stop) {
try {
Message msg = workQueue.poll(10, TimeUnit.SECONDS);
// Handle the message ...
System.out.println("Worker " + Thread.currentThread().getName() + " got message " + msg);
// Is it my special stop message.
if (msg == Stop) {
stop = true;
}
} catch (InterruptedException ex) {
// Just stop on interrupt.
stop = true;
}
}
}
}
Map<Integer, BlockingQueue<Message>> queues = new HashMap<>();
public void test() throws InterruptedException {
// Keep track of my threads.
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 20; i++) {
// Make the queue for it.
BlockingQueue<Message> queue = new ArrayBlockingQueue(10);
// Build its thread, handing it the queue to use.
Thread thread = new Thread(new Worker(queue), "Worker-" + i);
threads.add(thread);
// Store the queue in the map.
queues.put(i, queue);
// Start the process.
thread.start();
}
// Test one.
queues.get(5).put(new Message("Hello"));
// Close down.
for (BlockingQueue<Message> q : queues.values()) {
// Stop each queue.
q.put(Stop);
}
// Join all threads to wait for them to finish.
for (Thread t : threads) {
t.join();
}
}
public static void main(String args[]) {
try {
new Test().test();
} catch (Throwable t) {
t.printStackTrace(System.err);
}
}
}
很多謝謝,我已經使用BlockQueue的2個線程,「寫入」和「讀取」到這個隊列的初始數據。但是在你的實現中 - >每個工人(我將有20個)將擁有自己的隊列 - >所以我將有20個隊列,並且我需要40個 - >我的主要類中將有40個隊列 - - >這是否有效? – user2319608
另外:爲什麼我需要所有線程等待? (t.join) - >每個線程都是一個獨立的線程,它必須處理它自己的消息(有時可能是空的,有時候可能是空的) – user2319608
@ user2319608 - 我使用連接允許所有線程在我的測試結束。你可能不需要那樣做。我不明白你需要40個線程。隊列只佔用很小的空間,只要你限制它們的大小。我已經限制每個隊列10項,如果你願意,你可以少用。 – OldCurmudgeon
- 1. 多線程C++消息傳遞
- 2. Android中的多線程:消息傳遞
- 3. 傳遞給多個線程的消息
- 4. 即時消息傳遞 - Java上的單連接或多線程
- 5. 如何將消息傳遞給線程
- 6. 線程間消息傳遞的實現
- 7. Android線程和消息傳遞
- 8. Haskell,通道,STM,線程,消息傳遞
- 9. Java主題消息傳遞
- 10. Java JMS消息傳遞
- 11. 將消息傳遞給Java中的asynchronus工作線程J2ME
- 12. Java發送消息線程
- 13. (Java多線程)如何在多線程中傳遞參數?
- 14. Windows API多線程消息
- 15. 消息隊列多線程
- 16. GNU無線電消息傳遞塊
- 17. 處理程序未能向主線程傳遞消息或Runnable
- 18. Qpid與Java的異步消息傳遞
- 19. msgpack:C++和java之間的消息傳遞
- 20. Java JMS混合消息傳遞實現
- 21. Android消息傳遞
- 22. Java多線程 - 將數據結構傳遞給線程
- 23. Clojure + RabbitMQ /多線程消息消耗
- 24. Java消息傳遞服務 - 未收到消息
- 25. Socket.IO消息傳遞到多個房間
- 26. g:消息多重參數傳遞
- 27. 如何將消息從工作線程傳遞到java中的GUI
- 28. Firebase消息傳遞錯誤:消息傳遞/權限被阻止
- 29. 消息隊列與消息傳遞
- 30. ServiceStack Redis消息傳遞 - 即時消息?
@OldCurmudgeon有一個很好的答案。有一件事你可能要小心的是「發送數據」到一個線程的概念。快速閱讀Java Concurrency教程,它可以幫助您更好地理解這些概念:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Meesh
謝謝,這個我已經閱讀 - >不能找到答案我的需求,歡呼 – user2319608