网站官网建设,wordpress 注册 验证码,退工在那个网站上做,客户关系管理crm课程作为一名Java开发者#xff0c;是否曾经遇到过多线程并发的问题#xff1f;线程数量过多时#xff0c;会导致资源浪费#xff0c;应用性能下降#xff0c;甚至发生线程死锁的情况。那么#xff0c;有没有一种方法可以有效地管理线程#xff0c;避免这些问题呢作为一名Java开发者是否曾经遇到过多线程并发的问题线程数量过多时会导致资源浪费应用性能下降甚至发生线程死锁的情况。那么有没有一种方法可以有效地管理线程避免这些问题呢答案是肯定的那就是线程池。在本文中我们将通过Java的角度探讨线程池的奥妙深入了解线程池的优势学习如何使用线程池实现多线程并发。 线程池是如何创建的 JAVA中创建线程池主要有两类方法一类是通过Executors工厂类提供的方法该类提供了4种不同的线程池可供使用。另一类是通过ThreadPoolExecutor类进行自定义创建。 Executors工厂类 // 五种线程池// ExecutorService threadPool null;// threadPool Executors.newCachedThreadPool();//有缓冲的线程池线程数 JVM 控制// threadPool Executors.newFixedThreadPool(3);//固定大小的线程池// threadPool Executors.newScheduledThreadPool(2); // 具有延时定时功能// threadPool Executors.newSingleThreadExecutor();//单线程的线程池只有一个线程在工作// threadPool new ThreadPoolExecutor();//默认线程池可控制参数比较多 private static void createCachedThreadPool() { ExecutorService executorService Executors.newCachedThreadPool(); for (int i 0; i 10; i) { final int index i; executorService.execute(() - { // 获取线程名称,默认格式:pool-1-thread-1 System.out.println(DateUtil.now() Thread.currentThread().getName() index); // 等待2秒 sleep(2000); }); } } ThreadPoolExecutor类 ThreadPoolExecutor提供构造方法需要自己设置具体的参数更加灵活 public ThreadPoolExecutor(int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大工作线程 long keepAliveTime, // 存活时间线程没有任务执行时最多保持多久时间会终止。 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 工作队列 ThreadFactory threadFactory, // 线程工厂主要用来创建线程默及正常优先级、非守护线程。 RejectedExecutionHandler handler // 拒绝策略当创建新线程使线程数大于最大线程的情况下会执行 ) { // 省略... } 线程池的主要参数 corePoolSize 核心线程数 核心线程数线程池中始终存活的线程数。 BlockingQueue 工作队列 workQueue new ArrayBlockingQueue(5);//基于数组的先进先出队列有界 workQueue new LinkedBlockingQueue();//基于链表的先进先出队列无界 workQueue new SynchronousQueue();//无缓冲的等待队列无界 threadFactory 线程工厂 用于设置创建线程的工厂可以通过线程工厂给每个创建出来的。线程设置更有意义的名字。使用开源框架 guava 提供的 ThreadFactoryBuilder 可以快速给线程池里的线程设置有意义的名字代码如下 new ThreadFactoryBuilder().setNameFormat(XX-task-%d).build(); handler 拒绝策略拒绝处理任务时的策略4种可选默认为AbortPolicy。 参数描述AbortPolicy拒绝并抛出异常CallerRunsPolicy只用调用者所在线程来运行任务DiscardOldestPolicy抛弃队列头部最旧的一个任务并执行当前任务。DiscardPolicy抛弃当前任务。 RejectedExecutionHandler rejected null; rejected new ThreadPoolExecutor.AbortPolicy();//默认队列满了丢任务抛出异常 rejected new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务不异常 rejected new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删之后再尝试加入队列 rejected new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败那么主线程会自己去执行 线程池的执行过程 20230211161701 主线程提交任务到线程池如果当前线程数小于核心线程数创建新的线程用于执行任务如果不是下一步。此时核心线程已满再判断工作队列存放的线程数是否满了如果没有满则放入工作队列如果不是下一步。此时工作队列满了再看当前线程数是否等于最大线程数如果是的话执行拒绝策略如果不是创建新的线程执行任务。 配置线程池最大线程数 cpu密集型 maximumPoolSize n*cpu 1io密集型 maximumPoolSize 2 * n * cpu 线程池的关闭 可以通过调用线程池的 shutdown 或 shutdownNow 方法来关闭线程池。 相同点遍历所有的工作线程然后interrupt掉线程 不同点shutdown 调用后不再接受新的任务但是会等待正在运行的线程停止没有执行任务的线程。 shutdownNow 调用后会尝试停止正在运行或暂停任务的线程。 原创不易麻烦点个赞再走呗 本文由 mdnice 多平台发布