我正在写一个优化算法,创建大约100个线程。目前,我一次启动它们(for-loop),然后告诉每个线程它应该加入()。Java约100个并行线程,内存管理
我的问题是,现在每个线程使用多少内存,所以堆空间异常不会花费很长时间。我想要某种调度,但不知道如何实现它。
我有这样的想法:开始10个线程,每次完成其中一个完成一个新的。因此,一次只能运行10个线程,直到没有线程离开。
有人有想法或知道如何实现这样的事情吗?
非常感谢和问候来自科隆
马尔科
我正在写一个优化算法,创建大约100个线程。目前,我一次启动它们(for-loop),然后告诉每个线程它应该加入()。Java约100个并行线程,内存管理
我的问题是,现在每个线程使用多少内存,所以堆空间异常不会花费很长时间。我想要某种调度,但不知道如何实现它。
我有这样的想法:开始10个线程,每次完成其中一个完成一个新的。因此,一次只能运行10个线程,直到没有线程离开。
有人有想法或知道如何实现这样的事情吗?
非常感谢和问候来自科隆
马尔科
使用ThreadPoolExecutor用适当的最大池大小。
而是开始一个新的线程来完成新任务的,你有了更好的:
速度和内存的差异是巨大的,因为您不必为每个任务启动和停止线程。
java.util.concurrent包解释了一切。 一本书会更容易阅读,虽然:-(
下面是一个例子,让你开始首先,你需要导入:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
然后你需要把里面的东西方法:
ExecutorService pool = Executors.newFixedThreadPool(10);
for(final Task task: tasks) {
pool.execute(new Runnable() {
@Override
public void run() {
task.execute();
}
});
}
pool.shutdown();
while(!pool.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("Waiting for tasks to shutdown");
}
有关上述的一些注意事项:
java.util.concurrent.atomic
中的课程为 相当不错,前提是您需要更新共享状态 (例如,如果您希望 拥有您已处理多少个任务 的计数器)。
如果您对java和并发感兴趣,我强烈推荐这本书:http://www.javaconcurrencyinpractice.com/ – 2010-01-07 10:53:24