Java的线程最大数量

转自: http://expectforever.spaces.live.com/

 出现以下错误:
Exception in thread "Thread-2" java.lang.OutOfMemoryError: unable to create new native thread
 at java.lang.Thread.start0(Native Method)
 at java.lang.Thread.start(Thread.java:574)
 at com.verye.nad.framework.communication.SocketListener.run(SocketListener.java:66)

发现:
JVM在启动一个线程的时候,将为线程分配堆栈,在jdk1.4上为每个线程分配256K,在jdk1.5上为每个线程分配1M,

每个JVM中的最大线程数 :max Thread = (2G-Xmx)/stacksize

JDK1.4
  -Xmx750 = 4580 threads.
  -Xmx1000 = 3608 threads.
  -Xmx1500M = 1663 threads

JDK1.5
  -Xmx750M = 1129 threads
  -Xmx1000M = 880 threads
  -Xmx1500M = 384 threads 

### Java线程中的核心线程数与最大线程数 #### 核心线程数 (corePoolSize) 核心线程数是指线程池中保持的最小线程数量,即使这些线程处于空闲状态也不会被终止。当提交的任务数量超过核心线程数量并且已有线程都在忙碌时,新的任务将会进入等待队列。如果当前运行的线程少于核心线程数,则会立即启动一个新的线程来处理新到来的任务[^1]。 ```java int corePoolSize = 5; // 设定核心线程数目为5 ``` #### 最大线程数 (maximumPoolSize) 最大线程数表示在线程池中允许存在的最多线程数量。一旦达到此上限值,在没有可用的工作线程的情况下,任何额外的任务都将触发拒绝策略(除非使用无界队列)。只有当工作队列已满且活动线程数低于最大线程数时才会创建超出核心线程之外的新线程。 ```java int maximumPoolSize = 10; // 设定最大线程数目为10 ``` #### 使用 `ThreadPoolExecutor` 设置核心线程数和最大线程数 为了配置一个具有特定核心线程数和最大线程数的线程池,可以实例化 `ThreadPoolExecutor` 类,并传递相应的参数给构造函数: ```java import java.util.concurrent.*; // 定义线程池的各种属性 long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); // 构建带有指定核心/最大线程数的线程ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); ``` 上述代码片段展示了如何通过提供必要的参数来初始化一个拥有固定范围内的可调整大小的线程池。这使得可以根据应用程序的需求灵活控制并发度,从而优化性能表现[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值