我遇到以下问题:
主线程运行我的应用程序的代码(每秒调用几次),并且在某些时候它会在执行某个操作之前通知一个侦听器列表。然后,侦听器执行操作以从外部源收集数据,其中一些操作非常耗时。
现在,一方面,我想让每个听众有机会在我继续运行主线程之前完成它的工作(因为数据可能在操作完成后丢失或更改),另一方面我需要将整个通知收集过程限制到一定的超时,以保持合理的动作流程。
无论如何,我希望任何没有时间完成工作的听众继续工作。
一些示例代码:
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 :(得分: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) {}
}