加入一组总超时的线程
Join a group of threads with overall timeout
有没有办法同时加入一组线程 总超时 ?
假设我们有 Collection<Thread> threads;
和 int timeout;
。如果我不关心超时,我会做
for (Thread t : threads)
t.join();
但我想等到 所有 个线程完成,或经过一定时间,以先到者为准。我正在寻找可以做到这一点的(假设的)ThreadGroup.join(int)
。
请注意,我要求的与实际做的不同
for (Thread t : threads)
t.join(timeout);
相反,我正在寻找比
更简洁(也许更可靠)的东西
int timeout = 10000;
for (Thread t : threads) {
if (timeout <= 0) break;
long start = System.currentTimeMillis();
t.join(timeout);
long end = System.currentTimeMillis();
// substract time elapsed from next timeout:
timeout -= (int) (end - start);
}
首先创建一个 CountDownLatch,对组中的每个线程进行计数。
控制线程可以 await(timeout, TimeUnit)
闩锁。
启动组中的线程。
组中的每个线程都应在闩锁完成时递减它。
控制线程会等到组中的所有内容都完成或超时发生,并且因为 await
returns 一个布尔值,控制线程可以判断锁存器是自然递减还是发生超时。
有没有办法同时加入一组线程 总超时 ?
假设我们有 Collection<Thread> threads;
和 int timeout;
。如果我不关心超时,我会做
for (Thread t : threads)
t.join();
但我想等到 所有 个线程完成,或经过一定时间,以先到者为准。我正在寻找可以做到这一点的(假设的)ThreadGroup.join(int)
。
请注意,我要求的与实际做的不同
for (Thread t : threads)
t.join(timeout);
相反,我正在寻找比
更简洁(也许更可靠)的东西int timeout = 10000;
for (Thread t : threads) {
if (timeout <= 0) break;
long start = System.currentTimeMillis();
t.join(timeout);
long end = System.currentTimeMillis();
// substract time elapsed from next timeout:
timeout -= (int) (end - start);
}
首先创建一个 CountDownLatch,对组中的每个线程进行计数。
控制线程可以 await(timeout, TimeUnit)
闩锁。
启动组中的线程。
组中的每个线程都应在闩锁完成时递减它。
控制线程会等到组中的所有内容都完成或超时发生,并且因为 await
returns 一个布尔值,控制线程可以判断锁存器是自然递减还是发生超时。