一、创建线程池以及线程池的各种参数分析:
//不指定最大线程数,默认是Int的最大值 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(() -> { System.out.println("新建线程池对象,执行第一个默认线程"); }); executorService.shutdown(); //指定最大线程数 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10); newFixedThreadPool.submit(() -> { System.out.println("新建线程池对象,执行第二个默认线程,指定最大线程数"); }); newFixedThreadPool.shutdown(); //前2个都是创建的ThreadPoolExecutor线程池对象并返回,也可以直接创建线程池对象,7个参数分别为: /** * 1、corePoolSize:核心线程数,当线程池创建时就会创建,不会回收,直到线程池销毁 * 2、maximumPoolSize:线程池最大线程数,当maximumPoolSize-corePoolSize=临时线程,当临时线程超过keepAliveTime的时间没使用时会销毁 * 3、keepAliveTime:临时线程保持的最长时间的值, * 4、unit:临时线程保持的最长时间的时间单位,比如keepAliveTime=60,unit=秒,则临时线程超过60秒未使用则会销毁 * 5、workQueue:当线程池所有的线程都处于非空闲状态时,又有新的任务提交则会放入阻塞队列中等待执行,一般用ArrayBlockingQueue(指定队列的容量),数组类型的阻塞队列 * 6、threadFactory:创建线程的方法工厂,通过哪个工厂来创建线程,一般是按照默认的方式创建线程,比如new Thread() * 7、handler:任务的拒绝策略:a、什么时候触发任务拒绝?当所有线程处于非空闲状态,且阻塞队列的容量也已经满了的情况下,会触发任务拒绝策略 * b、如何拒绝?有4种任务拒绝策略: * 拒绝并抛出异常(默认); * 拒绝但并不抛出异常(不推荐); * 抛弃阻塞队列中等待最久的队列,并将当前队列加入 * 直接调用任务的run()方法执行线程,绕过线程池,直接执行run() * */ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); threadPoolExecutor.submit(() -> { });
二、在JVM中,线程与线程之间的数据共享问题: