线程超时:替代方法
虽然 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中文网其他相关文章!