Java大约100个并行线程,内存管理
我正在写一个优化算法,它可以创建大约100个线程。目前,我一次启动所有线程(for循环),然后告诉每个线程它应该加入() 我现在的问题是,每个线程都会占用大量内存,因此堆空间异常不会花费很长时间。我想要一些安排,但不知道如何实施 我有这样的想法:开始10个线程,每完成一个线程,就开始一个新的线程。因此,每次都有10个线程在运行,直到没有剩余线程为止 有人有想法或知道如何实现这样的事情吗 非常感谢您和科隆的问候Java大约100个并行线程,内存管理,java,memory-management,multithreading,scheduling,Java,Memory Management,Multithreading,Scheduling,我正在写一个优化算法,它可以创建大约100个线程。目前,我一次启动所有线程(for循环),然后告诉每个线程它应该加入() 我现在的问题是,每个线程都会占用大量内存,因此堆空间异常不会花费很长时间。我想要一些安排,但不知道如何实施 我有这样的想法:开始10个线程,每完成一个线程,就开始一个新的线程。因此,每次都有10个线程在运行,直到没有剩余线程为止 有人有想法或知道如何实现这样的事情吗 非常感谢您和科隆的问候 Marco使用具有适当最大池大小的线程。与其启动新线程来执行新任务,不如: 有一个要
Marco使用具有适当最大池大小的线程。与其启动新线程来执行新任务,不如:
- 有一个要执行的任务队列(而不是要运行的线程)
- 使用较小的线程池(正如Michael提到的)来处理这些任务
一本书会更容易阅读:-(以下是一个示例,让您开始阅读。首先,您需要导入的内容:
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");
}
关于上述内容的一些注意事项:
- 您需要实现自己的 实际实现的任务类 你的算法
- 任务类不必只是 有一个execute方法(实际上,如果 它有那个签名,你可以 让您的任务实现Runnable 并避免匿名内部类)
- 你需要确保
你所使用的一切都是正确的
同步。课程在
是 很好,如果你有共享状态 您需要更新(例如,如果您愿意 有多少任务的计数器 你已经处理过了)java.util.concurrent.atomic
- 您通常只需要尽可能多的 有核时执行的线程 /计算机上的CPU。经常 演出经常在演出结束后提高 线程数下降。 通常只有在以下情况下才使用更多线程 你的任务花费了很多时间 封锁