java中线程设置超时_Java:为ThreadPool中的线程设置超时

2023-05-16

我想为线程池中执行的线程设置超时.目前我有以下代码:

ExecutorService executor = Executors.newFixedThreadPool(8);

for(List l: partition) {

Runnable worker = new WorkerThread(l);

executor.execute(worker);

}

executor.shutdown();

while (!executor.isTerminated()) {

}

代码只是将大量对象拆分为子列表,并在单个线程中处理这些子列表.但这不是重点.

我想给线程池中的每个单线程一个超时.对于池中只有一个线程,我找到了以下解决方案:

Future> future = null;

for (List l : partition) {

Runnable worker = new WorkerThread(l);

future = executor.submit(worker);

}

try {

System.out.println("Started..");

System.out.println(future.get(3, TimeUnit.SECONDS));

System.out.println("Finished!");

} catch (TimeoutException e) {

System.out.println("Terminated!");

}

但这不适用于多个线程.也许我必须将每个线程放在List< Future>中.列出并遍历此列表并为每个未来对象设置超时?

有什么建议?

使用CountDownLatch后编辑:

CountDownLatch doneSignal = new CountDownLatch(partition.size());

List> tasks = new ArrayList>();

ExecutorService executor = Executors.newFixedThreadPool(8);

for (List l : partition) {

Runnable worker = new WorkerThread(l);

tasks.add(executor.submit(doneSignal, worker));

}

doneSignal.await(1, TimeUnit.SECONDS);

if (doneSignal.getCount() > 0) {

for (Future> fut : tasks) {

if (!fut.isDone()) {

System.out.println("Task " + fut + " has not finshed!");

//fut.cancel(true) Maybe we can interrupt a thread this way?!

}

}

}

到目前为止效果很好.

接下来的问题是如何中断超时的线程?我尝试fut.cancel(true)并在工作线程的一些关键循环中添加以下构造:

if(Thread.interrupted()) {

System.out.println("!!Thread -> " + Thread.currentThread().getName() + " INTERRUPTED!!");

return;

}

因此工作线程在超时后被“杀死”.这是一个好的解决方案吗?

此外:是否有可能获得在Future接口上超时的线程的名称?目前,我必须在Thread.interrupted()构造的if条件中打印出名称.

感谢帮助!

问候

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中线程设置超时_Java:为ThreadPool中的线程设置超时 的相关文章

随机推荐