Callable和Future结合线程池使用

复制代码
package com.leelen.esafe.test;

import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadPoolBuilderTest {
    // 创建线程池
    private static ExecutorService pool = new ThreadPoolExecutor(2, 4, 3000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

    @Test
    public void testThread1() {
        System.out.println("---start---");
        // 模拟20个并发
        int num = 20;
        List<MyTask> myTasks = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            MyTask myTask = new MyTask(i);
            myTasks.add(myTask);
        }
        // 执行任务
        List<Future<Integer>> futures = new ArrayList<>();
        try {
            for (int i = 0; i < myTasks.size(); i++) {
                // 线程执行返回结果
                Future<Integer> future = pool.submit(myTasks.get(i));
                futures.add(future);
            }
        } catch (Exception e) {
        }
        // 输出线程执行结果
        try {
            for (int i = 0; i < futures.size(); i++) {
                Future<Integer> future = futures.get(i);
                Integer result = future.get();
                System.out.println(result);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("---end---");
    }

    // Callable线程任务
    class MyTask implements Callable<Integer> {
        Integer tid;

        public MyTask(Integer tid) {
            this.tid = tid;
        }

        @Override
        public Integer call() throws Exception {
            System.out.println("this thread id is = " + tid);
            Thread.sleep(3000);
            return tid;
        }
    }
}
复制代码
posted @   黄进广寒  阅读(453)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-11-14 switch表达式可使用的类型
2018-11-14 drop、truncate和delete的区别
点击右上角即可分享
微信分享提示