首页 > Java > java教程 > ExecutorService 如何比 TimerTask 改进线程超时处理?

ExecutorService 如何比 TimerTask 改进线程超时处理?

Linda Hamilton
发布: 2024-12-20 05:01:12
原创
845 人浏览过

How Can ExecutorService Improve Thread Timeout Handling Over TimerTask?

线程超时:替代方法

虽然 TimerTask 可以处理线程内的超时,但这并不是最佳解决方案。请考虑使用 ExecutorService,因为它提供了一种全面的线程管理和超时方法。

ExecutorService 允许您创建可调用任务并将其提交执行。一旦提交,任务就可以通过 Future 对象进行监控。通过在 Future#get() 方法中指定超时,您可以控制线程在抛出异常之前应执行多长时间。

这是一个示例实现:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        // Replace this with your long-running task.
        Thread.sleep(4000);
        return "Ready!";
    }
}
登录后复制

在此场景中,任务运行 4 秒后完成。如果超时增加到 5 秒,任务将完成而不会终止。如果超时设置为较短的持续时间,则会抛出 TimeoutException 并取消任务。

要检查长时间运行的任务中的线程中断,请使用 while (!Thread.interrupted() ) { ... } 环形。通过这样做,任务可以在必要时优雅地退出。

以上是ExecutorService 如何比 TimerTask 改进线程超时处理?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板