美文网首页
FutureTask

FutureTask

作者: 云淡风轻任我行 | 来源:发表于2020-06-23 00:27 被阅读0次

    FutureTask

    RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口,所以FutureTask既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。

    FutureTask代码举例

    1 测试类-FutureTaskTest02

    package com.sqq.future;
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    
    /**
     * @description: Callable+FutureTask获取执行结果
     * 可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。
     * 所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
     * @author: shiqiangqiang
     * @createDate: 2020/6/21
     * @version: 1.0
     */
    public class FutureTaskTest02 {
        public static void main(String[] args) {
            test02();
        }
    
        /**
         * 第一种方式
         */
        private static void test01(){
            ExecutorService executor = Executors.newCachedThreadPool();
            Task task = new Task();
            FutureTask<Integer> futureTask = new FutureTask<>(task);
            executor.submit(futureTask);
            executor.shutdown();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
    
            System.out.println("主线程在执行任务");
    
            try {
                System.out.println("task运行结果" + futureTask.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
            System.out.println("所有任务执行完毕");
        }
    
        /**
         * 第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread
         */
        private static void test02(){
            Task task = new Task();
            FutureTask<Integer> futureTask = new FutureTask<>(task);
            Thread thread1 = new Thread(futureTask);
            thread1.start();
    
            try {
                System.out.println("test02 task运行结果" + futureTask.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
            System.out.println("test02 所有任务执行完毕");
        }
    
    }
    

    2 任务类-Task

    package com.sqq.future;
    
    import java.util.concurrent.Callable;
    
    /**
     * @description:
     * @author: shiqiangqiang
     * @createDate: 2020/6/21
     * @version: 1.0
     */
    public class Task implements Callable<Integer> {
    
        @Override
        public Integer call() throws Exception {
            System.out.println("子线程在进行计算");
            Thread.sleep(3000);
            int sum = 0;
            for (int i = 0; i < 100; i++){
                sum += i;
            }
            return sum;
        }
    }
    

    相关文章

      网友评论

          本文标题:FutureTask

          本文链接:https://www.haomeiwen.com/subject/sinqfktx.html