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
类提供的机制,它将以避免终止它们的方式管理实际线程。)