Java线程池,获取返回值

Posted 越深入,越清晰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程池,获取返回值相关的知识,希望对你有一定的参考价值。

 

程序中使用的是Callable接口,可以获取线程的返回值。

 

package liuzh;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


class Task implements Callable<String> {
    private String filename;

    public Task(String filename) {
        this.filename = filename;
    }
    
    @Override
    public String call() throws Exception {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("完成 "+ filename);
        return "返回值" + filename;
    }
}

/**
 * 创建一个线程池,将50个任务分配进去,并发量最大为5
 * 运行结束后,输出每个线程返回的结束
 * title:ThreadPoolExecutorTest
 * descript:
 * @author liuzh
 * @date 2016年5月18日 下午8:16:26
 */
public class ThreadPoolExecutorTest {
    
    public void start() throws InterruptedException, ExecutionException {
        /**
         * 创建线程池,并发量最大为5
         * LinkedBlockingDeque,表示执行任务或者放入队列
         */
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 0,
                TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(),
                new ThreadPoolExecutor.CallerRunsPolicy());

        //存储线程的返回值
        List<Future<String>> results = new LinkedList<Future<String>>();
        
        for (int i = 0; i < 10; i++) {
            Task task = new Task(String.valueOf(i));
            System.out.println("放入线程池:" + i);
            //调用submit可以获得线程的返回值
            Future<String> result = tpe.submit(task);
            results.add(result);
            
        }

        //此函数表示不再接收新任务,
        //如果不调用,awaitTermination将一直阻塞
        tpe.shutdown();
        //1天,模拟永远等待
        System.out.println(tpe.awaitTermination(1, TimeUnit.DAYS));

        //输出结果
        for (int i = 0; i < 10; i++) {
            System.out.println(results.get(i).get());
        }

    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();
        test.start();
    }

}

输出样例:

放入线程池:0
放入线程池:1
放入线程池:2
放入线程池:3
放入线程池:4
放入线程池:5
放入线程池:6
放入线程池:7
放入线程池:8
放入线程池:9
完成 1
完成 0
完成 2
完成 3
完成 4
完成 9
完成 6
完成 8
完成 5
完成 7
true
返回值0
返回值1
返回值2
返回值3
返回值4
返回值5
返回值6
返回值7
返回值8
返回值9

 

参考:http://www.cnblogs.com/vhua/p/5277694.html

        http://www.cnblogs.com/hzmark/archive/2013/01/21/JavaExecutor.html

以上是关于Java线程池,获取返回值的主要内容,如果未能解决你的问题,请参考以下文章

java线程池的自带监控,线程池返回值的控制

高效开发:java中Future的使用

java 线程池

Java——线程池

Java线程池详解

Java线程池详解