
cpu不同,最多能开的线程肯定不一样,我们一般的程序肯定是能满足的,也必要去纠结这种问题把。
一般你想开多少就能开多少的。你的对象继承了Thread或是实现了Runnable接口后,可以在main()方法中创建多个这样的对象,要很多的话,可以用for循环来创建你想要的个数。
class
MyThread
implements
Runnable{
public
void
run(){
for(int
i
=
1;
i
<
10;
i++){
Systemoutprintln(ThreadcurrentThread()getName());
}
}
}
public
class
Test{
public
static
void
main(String[]
args){
MyThread[]
myThread;
for(int
i
=
0;
i
<
100;
i++){
myThread[i]
=
new
MyThread();
}
for(int
i
=
0;
i
<
100;
i++){
new
Thread(myThread[i])start();
}
}
}
没听过考虑cpu的负载哦。
都是按程序的要求来的。
1:获取cpu核心数:
RuntimegetRuntime()availableProcessors();创建线程池:
ExecutorsnewFixedThreadPool(nThreads);//nThreads为线程数2:这个只要服务器内存够大,CPU核心数较多,处理数据比较强就好了,注意不要一下分配几千个线程,可 能会导致堆栈溢出的,这样程序就挂了,因为线程很费内存资源
底层的实现原理基本一样: new线程池的时候生成一个任务队列(blockQueue<Runnable>),第一次执行execute()或者submit()方法时会创建一个循环的线程,用于反复读取队列中的任务并执行之(ps:第一次提交的任务是不用进入任务队列,由刚创建的线程直接执行 ),后续的 execute()或者submit() *** 作则直接提交Runnable任务到队列里队列为空时,循环线程就会被blockQueue的take()方法阻塞住
SingleThreadExecutor其实是FixedThreadPool的一个特例,SingleThreadExecutor指定对于同一个队列只有一个线程去循环读取队列任务并执行, FiexedThreadPool则可以为同一队列指定多个线程去循环读取队列任务并执行
newFixedThreadPool(10)会产生10个线程去读取同一个任务队列,但这10个线程不是同时产生,而是提交一个任务(即执行一次execute()或者submit()方法)产生一个,当提交的任务数量超过10个,第11个任务直接提交到blockQueue<Runnable>队列里,然后由这10个线程中的某个线程去获取并执行该任务FixedThreadPool产生的10个线程以后也不会被回收成9个,更不可能增加到11个
CacheThreadPool不指定具体数量的线程去读取并只执行任务队列中的任务,但是它有个最大线程数(IntegerMAX_VALUE=2的32次-1), 当 任务队列饱和无法插入新任务时,会自动生成一个新的线程去执行新插入的任务,并参与读取饱和的任务队列并执行如果高峰期生成了10个线程,低谷期只需要一个线程来执行,其余的9个线程在存活一段时间后就会被终止存活时间默认是一分钟这一点要和FixedThreadPool区分
ScheduledThreadPool线程池线程数量也需要预先指定,它的主要特点是按计划延时读取并执行队列任务
无论何种线程,当任务队列增加任务的速度大于队列读取执行的速度时,就可能产生任务丢失的情况,丢失的概率由低到高依次是
CacheThreadPool > newFixedThreadPool > SingleThreadExecutor,这个很好理解这种情况下,程序默认都会向外抛出RejectedExecutionException异常
new 线程池的时候另一个构造参数 ThreadFactory,主要用途就是对提交的任务做个简单的封装
以上就是关于java中想开多线程,线程数量控制全部的内容,包括:java中想开多线程,线程数量控制、Java如何依据cpu核数设置合适的线程数、java web 有多个threadpool时候如何设定线程数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)