并发包CallableAndFuture

Posted 安静

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发包CallableAndFuture相关的知识,希望对你有一定的参考价值。

/**
 * 
 * @描述: Callable   Future
 * 
 *    程序运行一个线程,线程运行结束后,我们可以获取另一个线程的结果
 *      
 * @作者: Wnj .
 * @创建时间: 2017年5月16日 .
 * @版本: 1.0 .
 */
public class CallableAndFuture {
    
    /**
     * 单个任务
     * <功能详细描述>
     */
    public static void single() {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        /**
         * 需要返回结果的就使用submit
         */
        Future<String> future = threadPool.submit(new Callable<String>() {
            public String call() throws Exception {
                Thread.sleep(2000);
                return "hello";
            };
        });
        System.out.println("等待拿到结果");
        try {
            System.out.println("拿到结果" + future.get());
            // System.out.println("拿到结果" + future.get(1,TimeUnit.SECONDS));//1秒钟内必须返回
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 多个任务
     * <功能详细描述>
     */
    public static void array() {
        ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
        /**
         * 一定就提交一组Callable任务,只要一个任务完成了就能获取到结果
         */
        CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
        for (int i = 1; i <= 10; i++) {
            final int seq = i;
            completionService.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(5000));
                    return seq;
                }
            });
        }
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println(completionService.take().get());
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        array();
    }
    

 

以上是关于并发包CallableAndFuture的主要内容,如果未能解决你的问题,请参考以下文章

CallableAndFuture

并发包学习之-atomic包

Java并发包基石-AQS详解

Java并发包基石-AQS详解

Java并发包基石-AQS详解

举例详解 java.util.concurrent 并发包 4 种常见类