Java – 运行一次线程两次

来自另一篇文章 :

如果一个Thread需要多次运行,那么应该创建一个新的Thread实例并在其上调用start。

这是怎么做到的?

我会使用另一层抽象。 使用ExecutorService

这是一个简单的例子:

 public static void main(String args[]) throws InterruptedException { final ExecutorService service = Executors.newCachedThreadPool(); final class MyTask implements Runnable { @Override public void run() { System.out.println("Running my task."); } }; for (int i = 0; i < 10; ++i) { service.submit(new MyTask()); } service.shutdown(); service.awaitTermination(1, TimeUnit.DAYS); } 

只需将您的任务多次转储到service中即可。

ExecutorService是一个线程池 - 它有许多Thread来接收任务。 这消除了产生新Thread的开销,因为它会缓存它们。

java Thread无法运行两次。 一旦启动并完成其工作,就无法再次启动(调用方法start将失败)。 因此,您必须创建一个新的Thread实例(使用相同的Runnable )并启动它。

基本上,线程无法重新启动。

所以如果你想要一个可重用的“线程”,你真的在​​谈论一个Runnable 。 你可能会这样做:

  Runnable myTask = new Runnable() { public void run() { // Do some task } } Thread t1 = new Thread(myTask); t1.start(); t1.join(); Thread t2 = new Thread(myTask); t2.start(); 

(这纯粹仅用于说明目的!使用更复杂的机制运行“runnables”要好得多,例如ExecutorService类提供的机制,它将以避免终止它们的方式管理实际线程。)