【面试八股文】每日一题:线程池用过吗?生产上你是如何设置合理参数?

线程池的拒绝策略请你谈谈

AbortPolicy(默认):直接抛出RejectedException异常阻止系统正常运行

CallerRunPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是

DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交

DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常.如果允许任务丢失,这是最好的拒绝策略

 

 

你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑

答案是一个都不用,我们生产上只能使用自定义的

Executors中JDK给你提供了为什么不用?

【面试八股文】每日一题:线程池用过吗?生产上你是如何设置合理参数?_第1张图片

 

 

你在工作中是如何创建线程池的,是否自定义过线程池使用

public class MyThreadPoolDemo {

    public static void main(String[] args) {

        ExecutorService threadPool = new ThreadPoolExecutor(

                2,

                5,

                1L,

                TimeUnit.SECONDS,

                new LinkedBlockingDeque(3),

                Executors.defaultThreadFactory(),

                //默认抛出异常

                //new ThreadPoolExecutor.AbortPolicy()

                //回退调用者

                //new ThreadPoolExecutor.CallerRunsPolicy()

                //处理不来的不处理

                //new ThreadPoolExecutor.DiscardOldestPolicy()

                new ThreadPoolExecutor.DiscardPolicy()

        );

        //模拟10个用户来办理业务 没有用户就是来自外部的请求线程.

        try {

            for (int i = 1; i <= 10; i++) {

                threadPool.execute(() -> {

                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");

                });

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            threadPool.shutdown();

        }

        //threadPoolInit();

    }

 

    private static void threadPoolInit() {

        /**

         * 一池5个处理线程

         */

        //ExecutorService threadPool= Executors.newFixedThreadPool(5);

        /**

         * 一池一线程

         */

        //ExecutorService threadPool= Executors.newSingleThreadExecutor();

        /**

         * 一池N线程

         */

        ExecutorService threadPool = Executors.newCachedThreadPool();

        //模拟10个用户来办理业务 没有用户就是来自外部的请求线程.

        try {

            for (int i = 1; i <= 20; i++) {

                threadPool.execute(() -> {

                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");

                });

                try {

                    TimeUnit.MICROSECONDS.sleep(200);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            threadPool.shutdown();

        }

    }

}

 

合理配置线程池你是如何考虑的?

CPU密集型

System.out.println(Runtime.getRuntime().availableProcessors());查看CPU核数

【面试八股文】每日一题:线程池用过吗?生产上你是如何设置合理参数?_第2张图片

IO密集型

5d4da44d5b3744f48c17a9b5ee7231fb.png

 

【面试八股文】每日一题:线程池用过吗?生产上你是如何设置合理参数?_第3张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(大厂后端工程师面试,面试,职场和发展)