gpt4 book ai didi

Java - 超时长时间运行可调用线程

转载 作者:行者123 更新时间:2023-11-30 06:26:10 25 4
gpt4 key购买 nike

public class FutureGetTimeoutTest {

private static final ExecutorService THREAD_POOL = Executors.newFixedThreadPool(5);

public static void main(String[] args) throws InterruptedException, ExecutionException {

List<String> respList = new ArrayList<String>();

List<Future<String>> futures = new ArrayList<Future<String>>();
futures.add(THREAD_POOL.submit(new CallableTask(1L)));
futures.add(THREAD_POOL.submit(new CallableTask(2L)));
futures.add(THREAD_POOL.submit(new CallableTask(3L)));

long start = System.currentTimeMillis();
System.out.println(start);
for (Future<String> future : futures) {
try {
respList.add(future.get(10000, TimeUnit.MILLISECONDS));
/*
* Timeout time for 2nd Task starts only at the end of 1st Task Timeout
* and so 2nd task is able to run for 20s and 3rd task for 30s!
*/
} catch (TimeoutException e) {
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
System.out.println(end);
System.out.println(end - start);
System.out.println(respList);

}

}

class CallableTask implements Callable<String> {

private long ipAddressL;

public CallableTask(long ipAddressL) {
this.ipAddressL = ipAddressL;
}

@Override
public String call() throws Exception {

if (ipAddressL == 1) {
Thread.sleep(10000);
/* Imagine a DB operation taking more time. */
return "1";
} else if (ipAddressL == 2) {
Thread.sleep(20000);
return "2";
} else {
Thread.sleep(30000);
return "3";
}

}
}

如果每个任务分别花费超过 10 秒,我想返回一个空字符串或只是终止线程或在每个任务中抛出 TimeoutException。

假设第一个线程需要 10 秒,Future.get()会等待10s然后超时。我将捕获异常并继续第二个 future 对象的迭代。假设第二个线程此时尚未完成(这意味着它运行了 10 秒,而第一个线程已运行且仍在运行),现在 Future.get()第二个线程将再等待 10 秒,因此后续线程总共等待 20 秒,依此类推。

future.get(1000, TimeUnit.MILLISECONDS) (1 sec), 

将确保整个操作的 10 秒限制,但我需要通过对每个单独的并发任务设置 10 秒的限制来对整个操作限制 10 秒。

最佳答案

使用 THREAD_POOL.invokeAll 而不是 submit 等待 10 秒任务完成。

如果某些任务在 10 秒内完成,您可以使用 future.isDone() 检查,并使用 future.get 检索结果而不阻塞.

关于Java - 超时长时间运行可调用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47162304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com