码迷,mamicode.com
首页 > 编程语言 > 详细

java 自定义线程池

时间:2019-11-12 10:53:05      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:OLE   locking   内存   RoCE   cat   exec   for   线程池   导致   

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();
        }
    }
}

java 自定义线程池

标签:OLE   locking   内存   RoCE   cat   exec   for   线程池   导致   

原文地址:https://www.cnblogs.com/yloved/p/11840230.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!