Java线程池系列(二):获取线程的返回结果


系列导航

(一) 简单介绍及示例
(二)获取线程的返回结果


获取线程的返回结果


一、使用介绍

我们在执行线程后,如果需要获取执行的结果,则需要用到Callable和Future来获得。常用的有Callable+Future和Callable+FutureTask。


二、示例

PS:shutdown()方法执行后,会立刻停止添加任务,但是已经在执行的任务会处理完成;而shutdownNow()方法将会尝试停止所有任务,并返回未执行的任务。


1、Future

Future接口有一个泛型参数,在实际运行时,通过future.get()方法来获取线程的真正运行结果。

public class CallableFuture {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        Future<Integer> result = cachedThreadPool.submit(new Task1());
        cachedThreadPool.shutdown();

        try {
            //get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回
            System.out.println("-------------task1返回结果 : " + result.get());
        } catch (Exception e) {
            System.out.println("-------------接收结果失败-------------");
            e.printStackTrace();
        }

        System.out.println("-------------task执行完成");
    }
}

class Task1 implements Callable<Integer> {
    public Integer call() throws Exception {
        System.out.println("----------子线程调度 : " + Thread.currentThread().getId());
        Thread.sleep(2000);
        return (int) (Math.random() * 100);
    }
}

2、FutureTask

FutureTask是一种可以取消的(在线程执行完成之前取消)异步线程,它实现了Runnable接口和Future接口,也就是说,它可以自行运行,也可以交给线程池管理。

public class CallableFutureTask {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task2());
        //自行运行得到结果
//        futureTask.run();

        //交给线程池管理运行
        cachedThreadPool.submit(futureTask);
        cachedThreadPool.shutdown();

        try {
            //get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回
            System.out.println("-------------task1返回结果 : " + futureTask.get());
        } catch (Exception e) {
            System.out.println("-------------接收结果失败-------------");
            e.printStackTrace();
        }

        System.out.println("-------------task执行完成");
    }
}

class Task2 implements Callable<Integer> {
    public Integer call() throws Exception {
        System.out.println("----------子线程调度 : " + Thread.currentThread().getId());
        Thread.sleep(2000);
        return (int) (Math.random() * 100);
    }
}

你可能感兴趣的:(Java,线程池,java,多线程)