2013-10-07 93 views
0

我有兩個線程的應用程序,一個寫入隊列,另一個讀取異步。 我需要創建第三個生成20多個。 新創建的線程將運行直到明確停止。那20個線程應該獲得「實時」數據以分析它。 每個20都有一個唯一的ID /名稱。我需要將相關數據(即READ線程收集)發送到正確的線程(20個線程)。例如如果數據包含一個id爲2的字符串 - >我需要將它發送到ID = 2的線程。 我的問題是:我應該如何爲20個線程中的每一個持有一個「指針」並將相關數據發送給它? (我可以搜索可運行列表中的id(這將保持線程) - >但是然後我需要調用一個方法「NewData(string)」來將數據發送到正在運行的線程)。 我該怎麼做? TIA PazJava多線程消息傳遞

+0

@OldCurmudgeon有一個很好的答案。有一件事你可能要小心的是「發送數據」到一個線程的概念。快速閱讀Java Concurrency教程,它可以幫助您更好地理解這些概念:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Meesh

+0

謝謝,這個我已經閱讀 - >不能找到答案我的需求,歡呼 – user2319608

回答

3

您可能會更好地使用隊列與您的線程進行通信。然後,您可以將所有隊列放入地圖中以便於訪問。我會推薦一個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); 
    } 
    } 

} 
+0

很多謝謝,我已經使用BlockQueue的2個線程,「寫入」和「讀取」到這個隊列的初始數據。但是在你的實現中 - >每個工人(我將有20個)將擁有自己的隊列 - >所以我將有20個隊列,並且我需要40個 - >我的主要類中將有40個隊列 - - >這是否有效? – user2319608

+0

另外:爲什麼我需要所有線程等待? (t.join) - >每個線程都是一個獨立的線程,它必須處理它自己的消息(有時可能是空的,有時候可能是空的) – user2319608

+0

@ user2319608 - 我使用連接允許所有線程在我的測試結束。你可能不需要那樣做。我不明白你需要40個線程。隊列只佔用很小的空間,只要你限制它們的大小。我已經限制每個隊列10項,如果你願意,你可以少用。 – OldCurmudgeon