Java 重用可运行对象

Java 重用可运行对象,java,multithreading,runnable,Java,Multithreading,Runnable,有没有任何方法可以让我并行运行固定数量的线程,并在其中一个线程完成后立即重用可运行对象?因此,给定N组Runnable obj的运行参数,并且只有M个Runnable对象(M

有没有任何方法可以让我并行运行固定数量的线程,并在其中一个线程完成后立即重用可运行对象?因此,给定N组Runnable obj的运行参数,并且只有M个Runnable对象(M您可以实现生产者-消费者模式,如:

    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());
int n=10;
Executor Executor=Executors.newFixedThreadPool(n);
最终阻塞队列任务=新的ArrayBlockingQueue(1024);
对于(int i=0;i
问题的解决方案在于Java Executor和ExecutorService框架中提供的高级并发框架。您可以使用它来创建线程池(可能是固定大小的)。然后,您可以使用生产者-消费者模式将您的可运行任务排队。我已经读过关于ExecutorService的内容,我的问题是,标题中指定了在一个线程完成后立即重用可运行对象。对我来说,重用可运行对象听起来像是糟糕的设计。runnable应该专用于单个线程,当该线程终止时,这意味着runnable中的任务无论如何都应该完成。为什么您希望另一个线程再次执行它?当一些旧线程结束时,您希望在新线程中重新使用
Runnable
,这让我想知道,为什么旧线程会结束?创建和销毁线程是昂贵的。如果每个
Runnable
代表一个不同的任务,为什么不设计线程以保持运行,并一个接一个地执行任务。。。?这种设计思想被称为线程池,
java.util.concurrent.ThreadPoolExecutor
和相关类已经为您实现了它。在一个对象分配最少的系统中重用Runnable并不是一个糟糕的设计。我正在用对称搜索算法处理AI游戏树。但是,是的,我可以设计一个线程来完成一个又一个任务,并将所有任务分配给固定数量的可运行程序,然后执行它们。干杯。正如我指定的那样,我需要一种方法来重用固定数量的可运行对象,而不是为每个新任务定义一个新对象。实际上,这正是您需要的:我们不为每个任务创建可运行对象,而是使用固定数量的可运行对象。