这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。

实现效果:
启动一个任务,然后等待任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中止任务。
代码实现:
- 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 TaskTimeoutDemo {
 - public static void main(String[] args) {
 - System.out.println("Start ...");
 - ExecutorService exec = Executors.newCachedThreadPool();
 - testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒
 - 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秒后中止任务
 - 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);
 - System.out.println("failReason : " + failReason);
 - }
 - }
 - class MyTask implements Callable
 { - @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;
 - }
 - }
 
运行结果:
- Start ...
 - ----------------------------------------------------------------------------------------------------
 - taskResult : true
 - failReason : null
 - ---------------------------------------------
 - taskResult : null
 - failReason : 主线程等待计算结果超时,因此中断任务线程!
 - End!
 
                分享名称:控制Java线程超时后中止的方案
                
                转载源于:http://www.csdahua.cn/qtweb/news39/426489.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网