Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java大约100个并行线程,内存管理_Java_Memory Management_Multithreading_Scheduling - Fatal编程技术网

Java大约100个并行线程,内存管理

Java大约100个并行线程,内存管理,java,memory-management,multithreading,scheduling,Java,Memory Management,Multithreading,Scheduling,我正在写一个优化算法,它可以创建大约100个线程。目前,我一次启动所有线程(for循环),然后告诉每个线程它应该加入() 我现在的问题是,每个线程都会占用大量内存,因此堆空间异常不会花费很长时间。我想要一些安排,但不知道如何实施 我有这样的想法:开始10个线程,每完成一个线程,就开始一个新的线程。因此,每次都有10个线程在运行,直到没有剩余线程为止 有人有想法或知道如何实现这样的事情吗 非常感谢您和科隆的问候 Marco使用具有适当最大池大小的线程。与其启动新线程来执行新任务,不如: 有一个要

我正在写一个优化算法,它可以创建大约100个线程。目前,我一次启动所有线程(for循环),然后告诉每个线程它应该加入()

我现在的问题是,每个线程都会占用大量内存,因此堆空间异常不会花费很长时间。我想要一些安排,但不知道如何实施

我有这样的想法:开始10个线程,每完成一个线程,就开始一个新的线程。因此,每次都有10个线程在运行,直到没有剩余线程为止

有人有想法或知道如何实现这样的事情吗

非常感谢您和科隆的问候


Marco

使用具有适当最大池大小的线程。

与其启动新线程来执行新任务,不如:

  • 有一个要执行的任务队列(而不是要运行的线程)
  • 使用较小的线程池(正如Michael提到的)来处理这些任务
速度和内存的差异是巨大的,因为您不必为每个任务启动和停止线程

包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");
    }
关于上述内容的一些注意事项:

  • 您需要实现自己的 实际实现的任务类 你的算法
  • 任务类不必只是 有一个execute方法(实际上,如果 它有那个签名,你可以 让您的任务实现Runnable 并避免匿名内部类)
  • 你需要确保 你所使用的一切都是正确的 同步。课程在
    java.util.concurrent.atomic
    是 很好,如果你有共享状态 您需要更新(例如,如果您愿意 有多少任务的计数器 你已经处理过了)
  • 您通常只需要尽可能多的 有核时执行的线程 /计算机上的CPU。经常 演出经常在演出结束后提高 线程数下降。 通常只有在以下情况下才使用更多线程 你的任务花费了很多时间 封锁

考虑您将使用的机器中的内核数。如果您通常运行的线程数等于内核数,则性能最佳。正如KLE所说,使用线程池。

如果您对java和并发性感兴趣,我强烈推荐这本书:我目前每次运行2个线程,因为它是Intel的Core2Duo。performmance看起来不错……如果您完全受CPU限制,这可能是真的,但是如果存在任何阻塞操作(例如IO、休眠、某些类型的锁定),那么您通常需要比内核更多的线程来保持内核的充分利用。