线程池不允许使用Executors去创建,使用Guava ThreadPoolExecutor创建。

package com.JUC; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.*; //共享资源 public class SynchronizedExample { public void func1() { synchronized (this) { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print (Thread.currentThread().getName()+ i + " "); } } } //入口 public static void main(String[] args) { SynchronizedExample e1 = new SynchronizedExample(); //获取系统处理器个数,作为线程池数量 int nThreads = Runtime.getRuntime().availableProcessors(); //设置名称 ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("%d---").build(); /** 参数1: corePoolSize: 线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。 这里需要注意的是: 在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动 除非调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程。 再考虑到keepAliveTime和allowCoreThreadTimeOut超时参数的影响,所以没有任务需要执行的时候,线程池的大小不一定是corePoolSize。 参数2: maximumPoolSize: 线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。 这里值得一提的是largestPoolSize,该变量记录了线程池在整个生命周期中曾经出现的最大线程个数。为什么说是曾经呢?因为线程池创建之后, 可以调用setMaximumPoolSize()改变运行的最大线程的数目。 参数3: keepAliveTime: 如果一个线程处在空闲状态的时间超过了该属性值,就会因为超时而退出。举个例子,如果线程池的核心大小corePoolSize=5,而当前大小poolSize =8, 那么超出核心大小的线程,会按照keepAliveTime的值判断是否会超时退出。如果线程池的核心大小corePoolSize=5,而当前大小poolSize =5, 那么线程池中所有线程都是核心线程,这个时候线程是否会退出,取决于allowCoreThreadTimeOut。 参数4: TimeUnit unit, 上一个参数(keepAliveTime)的单位 参数5: BlockingQueue 阻塞队列 通过BlockingQueue暂存还没有来得及执行的任务。 构造传入大小 参数6: ThreadFactory 线程工厂,传入Guava创建的ThreadFactoryBuilder 这里可以用其他的 参数7: RejectedExecutionHandler 拒绝执行策略 多种 */ ExecutorService pool = new ThreadPoolExecutor(nThreads, 200, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); //执行任务 pool.execute(() -> e1.func1()); pool.execute(() -> e1.func1()); //发送指令结束队列的任务直接死,其他等待结束 pool.shutdown(); // pool.shutdownNow(); 马上结束 try{ //判断是否结束 boolean flag = pool.awaitTermination(2,TimeUnit.SECONDS); while (!flag){ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程还未结束"); } }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("线程结束"); } }

__EOF__

本文作者华哥哥
本文链接https://www.cnblogs.com/rainbow--/p/14413452.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小秦的开发梦  阅读(1000)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示