同一个线程是否可以在不销毁和重新创建线程的情况下一个一个地执行多个任务?

Can same thread be used to execute many tasks one by one without destroying and re-creating thread?

是否可以在不销毁和重新创建线程的情况下使用同一个线程一个接一个地执行多个任务?

public class SimpleThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 10; i++) {
            Runnable worker = new WorkerThread("" + i);
            executorService.execute(worker); // How many threads are created?
        }

        executorService.shutdown();

        while (!executorService.isTerminated()) {

        }
        System.out.println("All threads Executed");
    }
}

ExecutorService executorService = Executors.newFixedThreadPool(5); 这将在 Executor.

中仅创建 5 个线程
  for (int i = 0; i < 10; i++) {
        Runnable worker = new WorkerThread("" + i);
        executorService.execute(worker); // How many threads are created?
    }

这将创建 10 个提交给执行程序服务执行的任务。 而 ExecutorService 将使用固定的 5 个线程来执行这 10 个任务。 所以是的,您将有一个线程执行多个任务而无需重新创建。

是的,同一个 Thread 可以用于 运行 多个任务。这就是 ExecutorService 所做的:它维护一个线程池以重用线程,而不是为每个任务创建新的线程。这是如何完成的粗略想法如下:

import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;

public class MyExecutor implements Executor {

  private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
  private final Thread thread = new Thread(() -> {
    try {
      while (!Thread.interrupted()) {
        queue.take().run();
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }, "my-executor-thread");

  @Override
  public void execute(Runnable command) {
    Objects.requireNonNull(command);
    queue.add(command);
    synchronized (thread) {
      if (thread.getState() == Thread.State.NEW) {
        thread.start();
      }
    }
  }

}

请注意,实际的实现要比这复杂得多。例如,我没有添加一种方法来创建一个新的 Thread 如果一些错误导致当前的死亡。我也不保护 Thread 免受 Runnable.

可能抛出的异常

如您所见,与 Thread 一起使用的 Runnable(通过新的 Thread(Runnable))只是等待任务被放入 BlockingQueue。当新任务添加到 BlockingQueue 时,Thread 接受它并执行 run()。这就是单个 Thread 可以 运行 多个任务而不会被销毁并由另一个取代它的方式。

请注意,这意味着如果池中的所有线程(或在本例中为单个线程)都忙于执行任务,则任何排队的任务都必须等待。