【问题标题】:Reusing Runnable objects重用 Runnable 对象
【发布时间】:2015-04-28 15:52:58
【问题描述】:

有什么方法可以并行运行固定的最大线程数,并在其中一个线程完成后立即重用 Runnable 对象?因此,给定 Runnable obj 的 N 组运行参数并且只有 M 个 Runnable 对象(M

【问题讨论】:

  • 您的问题的解决方案在于 Java Executor 和 ExecutorService 框架中提供的高级并发框架。您将使用它来创建一个线程池(可能是固定大小的)。然后,您将使用生产者-消费者模式将您的可运行任务排入队列。
  • 我已经阅读了有关 ExecutorService 的信息,我的问题是标题指定了在一个线程完成后立即重用 Runnable 对象。
  • 重用可运行文件对我来说听起来像是糟糕的设计。一个runnable应该专用于一个线程,当那个线程终止时,这意味着runnable中的任务无论如何都应该完成。为什么要另一个线程再次执行它?
  • 一旦一些旧线程结束,您想在新线程中重新使用Runnable 的想法让我想知道,为什么旧​​线程结束了?创建和销毁线程是昂贵的。如果每个Runnable 代表一个不同的任务,为什么不设计你的线程来保持运行,并在一个接一个的任务之后执行任务......?那个设计思路叫做线程池java.util.concurrent.ThreadPoolExecutor和相关类已经为你实现了。
  • 在对象分配应保持在最低限度的系统中重用 Runnable 并不是一个糟糕的设计。我正在使用对称搜索算法处理 AI 游戏树。但是,是的,我可以设计一个线程来完成一个又一个任务,并将所有任务分配给固定数量的 Runnables,然后执行它们。干杯。

标签: java multithreading runnable


【解决方案1】:

您可以像这样实现生产者-消费者模式:

    int n = 10;
    Executor executor = Executors.newFixedThreadPool(n);
    final BlockingQueue<Object> tasks = new ArrayBlockingQueue(1024);
    for (int i = 0; i < n; i++) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    while (!Thread.currentThread().isInterrupted()) {
                        Object task = tasks.take();
                        // process task
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
    }
    tasks.put(new Object());

【讨论】:

  • 正如我所指定的,我需要一种重用固定数量的 Runnable obj 的方法,而不是为每个新任务定义一个新的。
  • 在实践中,这正是您所需要的:我们不会为每个任务创建可运行对象,而是使用固定数量的可运行对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多