思路:
创建线程继承线程类或者实现线程接口
重写run方法
在run方法里面写for循环,
循环语句块中打印线程类的静态方法currentthread()getname()
+循环的自增值。
,主线程创建自定义对象实例。
调用start()方法ok、。
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的负载哦。
都是按程序的要求来的。
Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。
通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法 submit 扩展了基本方法 Executorexecute(javalangRunnable)。方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService 类来编写这些方法的自定义变体)。
Executors 类提供了用于此包中所提供的执行程序服务的工厂方法。
Executor ec = ExecutorsnewFixedThreadPool(5);
使用线程池,这样能够很好的控制线程个数,并且不要去管线程的关闭等 *** 作,由线程池来控制!
底层的实现原理基本一样: 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,主要用途就是对提交的任务做个简单的封装
1:获取cpu核心数:
RuntimegetRuntime()availableProcessors();创建线程池:
ExecutorsnewFixedThreadPool(nThreads);//nThreads为线程数2:这个只要服务器内存够大,CPU核心数较多,处理数据比较强就好了,注意不要一下分配几千个线程,可 能会导致堆栈溢出的,这样程序就挂了,因为线程很费内存资源
以上就是关于在java中怎样统计一个线程执行的次数和不能执行的次数全部的内容,包括:在java中怎样统计一个线程执行的次数和不能执行的次数、java中想开多线程,线程数量控制、java线程池ExecutorService,里面有多少空余线程,怎么看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)