2013-06-13 2 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) {} 
} 
Смежные вопросы