我在想这是否是最佳的做法。我有大约500个线程无限运行,但在完成一个处理周期后会休眠一分钟。
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
}
正在执行的代码非常简单,基本上只有这个。
class aThread extends Thread {
public void run(){
while(true){
Thread.sleep(ONE_MINUTE);
//Lots of computation every minute
}
}
}
我需要为每个正在运行的任务单独创建一个线程,因此改变架构不是一个选项。我尝试将我的线程池大小设置为Runtime.getRuntime().availableProcessors(),以尝试运行所有500个线程,但仅允许其中8个(4x超线程)执行。其他线程不会放弃并让其他线程轮流执行。我尝试使用wait()和notify(),但是仍然没有运气。如果有人有一个简单的示例或一些技巧,我将非常感激!
嗯,设计可以说是有缺陷的。这些线程实现了遗传编程或GP,一种学习算法。每个线程分析高级趋势并进行预测。如果线程完成,学习就会丢失。也就是说,我希望sleep()能够在一个线程“不学习”时允许我共享一些资源。
因此,实际要求是:如何安排维护状态并每2分钟运行一次的任务,但控制同时执行的数量。