Sub*_*ged 8 java multithreading executorservice threadpool
我想知道这是否是最好的方法.我有大约500个无限期运行的线程,但Thread.sleep在完成一个处理周期后会持续一分钟.
ExecutorService es = Executors.newFixedThreadPool(list.size()+1);
for (int i = 0; i < list.size(); i++) {
es.execute(coreAppVector.elementAt(i)); //coreAppVector is a vector of extends thread objects
}
Run Code Online (Sandbox Code Playgroud)
正在执行的代码非常简单,基本上就是这样
class aThread extends Thread {
public void run(){
while(true){
Thread.sleep(ONE_MINUTE);
//Lots of computation every minute
}
}
}
Run Code Online (Sandbox Code Playgroud)
我确实需要为每个正在运行的任务使用单独的线程,因此不能选择更改体系结构.我尝试使我的threadPool大小等于Runtime.getRuntime().availableProcessors(),它试图运行所有500个线程,但只允许8(4xhyperthreading)执行.其他线程不会投降,让其他线程轮到他们.我尝试输入wait()并通知(),但仍然没有运气.如果有人有一个简单的例子或一些提示,我将不胜感激!
嗯,设计可以说是有缺陷的.线程实现了遗传编程或GP,一种学习算法.每个线程分析高级趋势进行预测.如果线程完成,则学习将丢失.也就是说,我希望sleep()允许我分享一些资源,而一个线程不是"学习"
所以实际要求是
如何安排维护状态并每2分钟运行一次的任务,但是控制一次执行多少次.
dan*_*ben 13
如果您的线程没有终止,则这是线程内代码的错误,而不是线程池.有关更详细的帮助,您需要发布正在执行的代码.
另外,为什么在完成后让每个线程都进入休眠状态; 让它完成不是更好吗?
另外,我认为你通过让一些线程等于你想要执行的任务数来滥用线程池.线程池的要点是对所使用的资源数量进行约束; 这种方法并不比完全不使用线程池更好.
最后,您不需要将实例传递Thread给您的ExecutorService实例Runnable. ExecutorService维护自己的线程池,这些线程无限循环,从内部队列中拉出工作(工作就是Runnable你提交的).
eri*_*son 10
为什么不使用a ScheduledExecutorService来安排每个任务每分钟运行一次,而不是让所有这些线程空闲一整分钟?
ScheduledExecutorService workers =
Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
for (Runnable task : list) {
workers.scheduleWithFixedDelay(task, 0, 1, TimeUnit.MINUTES);
}
Run Code Online (Sandbox Code Playgroud)
你是什么意思,"改变架构不是一种选择"?如果你的意思是,你不能改变你的任务在所有的(具体的任务必须循环,而不是运行一次,以呼叫Thread.sleep()不能被删除),然后是"良好的业绩是不是一种选择,"无论是.
| 归档时间: |
|
| 查看次数: |
4717 次 |
| 最近记录: |