【问题标题】:Join a group of threads with overall timeout加入一组具有整体超时的线程
【发布时间】:2020-03-17 13:13:10
【问题描述】:

有没有办法同时加入一组线程整体超时

假设我们有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);
}

【问题讨论】:

  • 是否需要直接使用Thread对象?如果没有,您可以使用ExecutorService 并使用需要超时的invokeAll()

标签: java multithreading threadgroup


【解决方案1】:

首先为组中的每个线程创建一个计数。

控制线程可以await(timeout, TimeUnit) 上锁。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html#await-long-java.util.concurrent.TimeUnit-

启动组中的线程。

组中的每个线程都应该在完成时减少锁存器。

控制线程将一直等待,直到组中的所有内容都完成或发生超时,并且因为await 返回一个布尔值,所以控制线程可以判断锁存器是自然递减还是发生超时。

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 2015-08-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多