线程超时
Posted wzy-525
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程超时相关的知识,希望对你有一定的参考价值。
package com.nantian.winUtliTest.ThreadTest;
import java.util.HashMap;
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;
/**
* 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。
*
* @author Chen Feng
*/
public class ThreadTest {
public static void main(String[] args) {
// System.out.println("Start ...");
//
// ExecutorService exec = Executors.newCachedThreadPool(); //创建一个线程池
//
// testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒 ntaskResult : true failReason: null
// testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止 ntaskResult : null failReason : 主线程等待计算结果超时,因此中断任务线程!
//
// exec.shutdown();
// System.out.println("End!");
}
public static HashMap<String, String> testTask(ExecutorService exec, int timeout) {
// MyTask task = new MyTask();
a sA=new a();
Future<HashMap<String, String>> future = exec.submit(sA);
HashMap<String, String> taskResult = null;
String failReason = null;
try {
// 等待计算结果,最长等待timeout秒,timeout秒后中止任务
taskResult = future.get(timeout, TimeUnit.SECONDS);
} catch (InterruptedException e) {
failReason = "主线程在等待计算结果时被中断!";
} catch (ExecutionException e) {
failReason = "主线程等待计算结果,但计算抛出异常!";
} catch (TimeoutException e) {
failReason = "主线程等待计算结果超时,因此中断任务线程!";
exec.shutdownNow();
}
System.out.println("ntaskResult : " + taskResult.get("isSucc"));
System.out.println("failReason : " + failReason);
return taskResult;
}
}
//class MyTask implements Callable<Boolean> {
//
// @Override
// public Boolean call() throws Exception {
// // 总计耗时约10秒
// for (int i = 0; i < 100L; i++) {
// Thread.sleep(100); // 睡眠0.1秒
// System.out.print(‘-‘);
// }
// return Boolean.TRUE;
// }
//}
以上是关于线程超时的主要内容,如果未能解决你的问题,请参考以下文章
ExecutorService 使用 invokeAll 和超时异常后可调用线程上的超时未终止