可以在不破坏和重新创建线程的情况下,使用同一线程一个接一个地执行许多任务吗?

时间:2018-08-17 06:39:26

标签: java multithreading threadpool

在不破坏和重新创建线程的情况下,可以使用同一线程一个接一个地执行许多任务吗?

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

2 个答案:

答案 0 :(得分:3)

是的,相同的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引发的异常的影响。

如您所见,RunnableThread一起使用的Thread(Runnable)(通过新的BlockingQueue)只是等待任务放入BlockingQueue中。将新任务添加到Thread时,run()接受并执行Thread。这样一来,一个<!-- one --> <div id="parent-one"> <div id="head-one"> <!-- some code here --> </div> <div> <div> <input type='text' value='x' name='name'> </div> </div> </div> <!-- two--> <div id="parent-two"> <div id="head-two"> <!-- some code here --> </div> <div> <div> <input type='text' value='y' name='name'> </div> </div> </div> 可以执行多个任务而不被销毁,而另一个代替它。

请注意,这意味着如果池的所有线程(在这种情况下为单线程)正忙于某个任务,则任何排队的任务都必须等待。

答案 1 :(得分:0)

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个任务。 所以是的,您将有一个线程可以执行多个任务而无需重新创建。