下载后可任意编辑控制 Java 线程超时后中止的解决方案12024 年 4 月 19 日这里使用 JDK5+的 java.util.concurrent 包下的 API 实现,采纳这种方式是相对比较安全的。 实现效果: 启动一个任务,然后等待任务的计算结果同时设定一个超时时间,假如等待时间超出预设定的超时时间,则中止任务。 代码实现: Java 代码: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; 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; /** * 启动一个任务,然后等待任务的计算结果,假如等待时间超出预设定的超时时间,则中止任务。 天骄无双:.com * * @author Chen Feng */ public class TaskTimeoutDemo { public static void main(String[] args) { System.out.println("Start ..."); ExecutorService exec = Executors.newCachedThreadPool(); testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到 15 秒32024 年 4 月 19 日下载后可任意编辑 testTask(exec, 5); // 只等待 5 秒,任务还没结束,因此将任务中止 exec.shutdown(); System.out.println("End!"); } public static void testTask(ExecutorService exec, int timeout) { MyTask task = new MyTask(); Future future = exec.submit(task); Boolean taskResult = null; String failReason = null; try { // 等待计算结果,最长等待 timeout 秒,timeout 秒后中止42024 年 4 月 19 日下载后可任意编辑任务 taskResult = future.get(timeout, TimeUnit.SECONDS); } catch (InterruptedException e) { failReason = "主线程在等待计算结果时被中断!"; 九星天辰诀:www.22bl.com } catch (ExecutionException e) { failReason = "主线程等待计算结果,但计算抛出异常!"; } catch (TimeoutException e) { failReason = "主线程等待计算结果超时,因此中断任务线程!"; exec.shutdownNow(); } System.out.println("\ntaskResult : " + taskResult);52024 年 4 月 19 日下载后可任意编辑 System.out.println("failReason : " + failReason); } } class MyTask implements Callable { @Override public Boolean call() throws Exception { // 总计耗时约 10 秒 帝尊:.org for (int i = 0; i < 100L; i++) { Thread.sleep(100); // 睡眠 0.1 秒 System.out.print('-'); } return Boolean.TRUE; }62024 年 4 月 19 日下载后可任意编辑 } 运行结果: Java 代码: Start ... ---------------------------------------------------------------------------------------------------- taskResult : true failReason : null --------------------------------------------- taskResult : null failReason : 主线程等待计算结果超时,因此中断任务线程! End!72024 年 4 月 19 日