2013-06-13 64 views
0

我有以下問題:如何等待多個聽衆超時

主線程中運行我的應用程序的代碼(即是被稱爲幾次每秒),並在某些時候它通知在執行特定操作之前聽衆列表。聽衆然後執行操作以從外部來源收集數據,其中一些操作是耗時的。

現在,一方面我想給每個聽者一個機會,在我繼續運行主線程之前完成它的工作(因爲數據可能會在操作完成後丟失或更改),以及另一方面,我需要將整個通知 - 收集過程限制到一定的超時時間,以便保持合理的行動流程。

無論如何,我希望任何聽衆都沒有時間去完成它的工作來繼續。

一些示例代碼:

public class ExampleTimeoutNotifier { 
    private static ArrayList<ExampleTimeoutNotifierListener> listeners; 
    private static int timeOutInMillis; 
    public static void main(String[] args) { 
     timeOutInMillis = Integer.parseInt(args[0]); 

     // ... the following code is being called repeatedly on the main thread: 

      // How to limit the process timeout? 
      for (ExampleTimeoutNotifierListener l : listeners) { 
       l.collectBeforeAction(); 
      } 

     // Do the action... 
    } 

    public interface ExampleTimeoutNotifierListener { 
     public void collectBeforeAction(); 
    } 
} 
+0

也許你應該考慮同步的,如果我明白你的意思。這裏http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – CME64

+0

@ CME64你能解釋一下這可以幫到什麼嗎?我沒有併發問題,也不關心鎖定任何對象或數據。 – Elist

+0

這就是我從你的陳述中理解的「我想讓每個聽衆有機會在我繼續運行主線程之前完成它的工作(因爲數據可能會在操作完成後丟失或更改)」,請糾正我我錯了 – CME64

回答

0

這是我使用的代碼,它似乎工作得很好。 我不會將其標記爲我的選擇。現在,因爲我不知道我在做正確的方式...

final long startTime = System.currentTimeMillis(); 
ArrayList<Thread> threads = new ArrayList<Thread>(); 

for (final ExampleTimeoutNotifierListener l : listeners) { 
    Thread t = new Thread() { 
     @Override 
     public void run() { 
      try { 
       l.collectBeforeAction(); 
      } catch (Exception e) {} 
     } 
    }; 
    t.start(); 
    threads.add(t); 
} 

for (Thread t : threads) { 
    try { 
     long timeoutLeft = timeOutInMillis - (System.currentTimeMillis() - startTime); 
     if (timeoutLeft < 1) break; 
     t.join(); 
    } catch (InterruptedException e) {} 
}