例如,我有一些代码块需要 30 多秒才能执行,但如果它需要超过 30 秒,我想停止它。我正在尝试使用 executor.shutdown((, executor.awaitTermination(30, TimeUnit.SECONDS( 和 executor.shutdownNow((; 但我无法理解我必须在哪里编写我想在特定时间后终止的代码块。请举一个完美的例子。
这很简单:当使用线程时,没有可靠的方法来杀死该线程(例如,请参阅此处(。
唯一的选择:在另一个进程中启动另一个JVM - 因为实际上你可以杀死。详情请看这里。
当然 - 这不是要走的路。更好的方法是以定期检查"取消"命令的方式实现长时间运行的任务。
使用上述方法的方法,您只需将任务添加到executor
,然后在下一行代码中放入executor.shutdown();
它限制您的执行者执行其他任务,然后您的实际放置executor.awaitTermination(30, TimeUnit.SECONDS)
设置"计时器"以等待任务在此期间完成
一个简单的萨姆勒代码狙击手:
ExecutorService taskExecutor = Executors.newFixedThreadPool(1);
taskExecutor.execute(new MyTask());
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}