【问题标题】:Java about 100 parallel threads, memory managementJava约100个并行线程,内存管理
【发布时间】:2011-01-02 10:35:06
【问题描述】:

我正在编写一个创建大约 100 个线程的优化算法。目前,我一次启动它们(for-loop),然后我告诉每个线程它应该加入()。

我现在的问题是每个线程都使用了很多内存,所以堆空间异常不会花费很长时间。我想要某种调度,但不知道如何实现它。

我有这样的想法:启动 10 个线程,每次完成其中一个线程时都会启动一个新线程。这样总是一次运行 10 个线程,直到没有线程剩余。

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

非常感谢科隆的问候

马可

【问题讨论】:

标签: java memory-management multithreading scheduling


【解决方案1】:

使用具有适当最大池大小的ThreadPoolExecutor

【讨论】:

    【解决方案2】:

    这是一个让您入门的示例。首先,您需要导入的内容:

    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");
        }
    

    关于上面的一些注释:

    • 您需要实现自己的 实际实现的任务类 你的算法
    • 任务类不必只是 有一个执行方法(实际上,如果 它有那个签名,你可以 让你的任务实现 Runnable 并避免匿名内部类)
    • 您需要确保 你使用的一切都是正确的 同步的。中的班级 java.util.concurrent.atomic 是 如果您有共享状态,那就太好了 你需要更新(例如,如果你想 有多少任务的计数器 您已处理)。
    • 您通常只需要尽可能多的 有核心执行的线程 /cpus 在你的机器上。经常 性能通常会上升 线程数下降。 通常你只使用更多线程,如果 你的任务花费大量时间 被屏蔽了。

    【讨论】:

      【解决方案3】:

      与其启动一个新线程来执行一项新任务,不如这样做:

      • 有要执行的任务队列(而不是要运行的线程)
      • 使用较小的线程池(如 Michael 所述)处理这些任务

      速度和内存的差异很大,因为您不必为每个任务启动和停止线程。

      包 java.util.concurrent 解释了这一切。 不过一本书会更容易阅读:-(

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我目前一次运行 2 次,因为它是 Intel 的 Core2Duo。性能看起来不错...
        • 如果您完全受 CPU 限制,这可能是正确的,但如果有任何阻塞操作(例如 IO、睡眠、某些类型的锁定),那么您通常需要比内核更多的线程以保持核心充分利用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多