java 自定义线程池

public class MyThreadPoolDemo {
    public static void main(String[] args) {
//        System.out.println(Runtime.getRuntime().availableProcessors());

        //一池5个线程
//        ExecutorService threadPool= Executors.newFixedThreadPool(5);

        //一池1线程
//        ExecutorService threadPool= Executors.newSingleThreadExecutor();

        //一池n线程
//        ExecutorService threadPool= Executors.newCachedThreadPool();

        //工作中不能使用new Thread创建线程,应该使用自定义线程池,避免了创建线程的开销
        //工作中不能使用Excutors中定义好的线程池,因为其中的阻塞队列大小默认为Integer.MAX_VALUE,可能造成cpu无法分配内存,导致oom问题
        // 自定义线程池
        //最大线程数,也就是第二个参数,要根据主机的处理器数量判断
        //获取主机处理器数的方法:System.out.println(Runtime.getRuntime().availableProcessors());
        ExecutorService threadPool = new ThreadPoolExecutor(
                1, //核心线程数
                5,//最大线程数,当核心线程和阻塞队列都满了之后,扩展线程
                2,//空闲线程保存时间
                TimeUnit.SECONDS,//时间单位
                new LinkedBlockingQueue<>(5),//阻塞队列,核心线程满后,将任务放在阻塞队列等待
                Executors.defaultThreadFactory(),//默认线程工厂
                new ThreadPoolExecutor.DiscardPolicy());//线程池和阻塞队列都满时,要执行的拒绝策略


        //submit和execute的区别
        //有返回值的线程,用submit
        //无返回值的线程,两个都可以用
        try {
//            for (int i = 0; i < 10; i++) {
//                int finalI = i;
//                threadPool.execute(() -> {
//                    System.out.println(Thread.currentThread().getName()+"\t"+finalI);
//                });
//            }

            for (int i = 0; i < 10; i++) {
                int finalI = i;
                Future<Integer> future = threadPool.submit(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t" + finalI);
                    return finalI;
                });
                //会阻塞,直到获得返回值
                System.out.println(future.get());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
posted @ 2019-11-12 10:33  她的开呀  阅读(434)  评论(0)    收藏  举报