• 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();
            }
        }
    }
    
  • 相关阅读:
    概率dp——cf148D
    概率dp——处理分母为0的情况hdu3853
    概率dp的迭代方式小结——zoj3329,hdu4089,hdu4035
    概率dp——hdu4089推公式+循环迭代
    概率dp——期望水题hdu4405
    概率dp——逆推期望+循环迭代zoj3329
    单调栈——cf777E
    springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
    spring MVC、mybatis配置读写分离
    Spring 实现数据库读写分离
  • 原文地址:https://www.cnblogs.com/yloved/p/11840230.html
Copyright © 2020-2023  润新知