java 自定义线程池

Posted new 个对象()

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()+"	"+finalI);
//                });
//            }

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

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}

以上是关于java 自定义线程池的主要内容,如果未能解决你的问题,请参考以下文章

java 自定义线程池及参数怎么设置?

java 自定义线程池及参数怎么设置?

java自定义线程池实现

SpringBoot自定义异步任务线程池

如何自定义线程池工具类(ThreadPoolUtils)

如何自定义线程池工具类(ThreadPoolUtils)