500个工作线程,什么样的线程池?

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你提交的).

  • 正确.执行者不知道Runnable正在睡觉.在Runnable完成之前,执行程序认为它正在运行. (2认同)

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()不能被删除),然后是"良好的业绩是不是一种选择,"无论是.