• 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

  • 相关阅读:
    求解整数集合的交集(腾讯笔试)
    关于屏幕适配之比例布局
    (转)注册JNI函数的两种方式
    正则表达式记录
    当年一个简单可用的多线程断点续传类
    最近用到的几个工具方法
    Android中包含List成员变量的Parcel以及Parcel嵌套写法示例
    java实现计算MD5
    一个用于去除状态栏和虚拟导航栏的BaseActivity
    MVP的模板
  • 原文地址:https://www.cnblogs.com/liu-zh/p/5506492.html
Copyright © 2020-2023  润新知