java-线程(futureTask、callable)

要取到一个线程的返回值,则线程需要实现callable接口
返回值用future或futureTask来取得

public class FutureTaskTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { 
        Callable<Integer> callable = new Callable<Integer>() { 
            public Integer call() throws Exception { 
                return new Random().nextInt(100); 
            } 
        };
       
        //第一种用法:用list来拿到返回值**********8------------------//
        List<FutureTask<Integer>> futureList = new ArrayList<FutureTask<Integer>>();
        //1、创建10个futureTask,将10个futureTask放到list数组中
        for(int i=0; i<10; i++)
        {
           FutureTask<Integer> future = new FutureTask<Integer>(callable);
           futureList.add(future);
        }
        //2、用线程池去执行这10个futureTask
       //用线程池去实现
        ExecutorService service = Executors.newCachedThreadPool();
        for(int i=0; i<10; i++)
        {
        service.submit(futureList.get(i));
        }
        //打印返回的结果
        for(FutureTask<Integer> list :futureList)
        {
        System.out.println("******"+list.get()+"******");
        }
        //****************************-----------------**//
       
        //第二种方法:用completionService 来执行
        ExecutorService service1 = Executors.newScheduledThreadPool(12);
        CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(service1);
        for(int i=0; i<10; i++)
        {
        cs.submit(callable);
       
        }
        for(int i=0; i<10; i++){
        System.out.println(cs.take().get());
       
        }
        //线程结束
        service1.shutdown();
        service.shutdown();
      
    } 

猜你喜欢

转载自yxpjx01.iteye.com/blog/2220028