java多线程 callable和future学习

来源:互联网 发布:java 异或 php 编辑:程序博客网 时间:2024/05/19 12:37

执行一个线程,取得线程返回的结果
callable 返回一个结果,future取到返回的结果。

尝试使用的一个例子,实际中很多场景可以用到

package test;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorCompletionService;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;public class Test {    public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {        ExecutorService threadPool = Executors.newSingleThreadExecutor();        Future<String> future = threadPool.submit(new Callable<String>() {            @Override            public String call() throws Exception {                Thread.sleep(200);                return "Hello Honey";            }        });//提交返回的结果        System.out.println("等待结果");        System.out.println("拿到结果:" + future.get(1, TimeUnit.SECONDS));//future可以添加参数,此处超过一秒没有取到,我就不取了        ExecutorService threadPool2 = Executors.newFixedThreadPool(10);//提交一批量的结果,然后,立刻获得先获得的结果,同时捕获。应用需要查找        CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);        for (int i = 0; i < 10; i++) {            final int finalI = i;            completionService.submit(new Callable<Integer>() {                @Override                public Integer call() throws Exception {                    Thread.sleep(new Random().nextInt(5000));                    return finalI;                }            });        }        for (int i = 0; i < 10; i++) {            System.out.println(completionService.take().get());        }    }}
1 0