您的位置:首页 > 编程语言 > Java开发

Java中安全终止超时线程的方案

2015-09-09 20:08 579 查看
这里使用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;  

  

/** 

 * 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。 

 *  

 * @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<Boolean> 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<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;  

    }  

}  

 

运行结果:

Java代码  


Start ...  

----------------------------------------------------------------------------------------------------  

taskResult : true  

failReason : null  

---------------------------------------------  

taskResult : null  

failReason : 主线程等待计算结果超时,因此中断任务线程!  

End!  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: