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 @ 2020-11-14 15:01  黄进广寒  阅读(452)  评论(0编辑  收藏  举报