答案 0 :(得分:4)
我会使用另一层抽象。使用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
s来接收任务。这消除了产生新Thread
的开销,因为它会缓存它们。
答案 1 :(得分:2)
java Thread
无法运行两次。一旦启动并完成其工作,就无法再次启动(调用方法start
将失败)。因此,您必须创建Thread
的新实例(使用相同的Runnable
)并启动它。
答案 2 :(得分:2)
基本上,无法重新启动线程。
因此,如果您想要一个可重复使用的“线程”,那么您实际上是在谈论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
类之一提供,这将管理实际的线程以某种方式避免它们终止。)