8

从另一个帖子

如果一个线程需要运行不止一次,那么应该创建一个线程的新实例并调用它的启动。

这是怎么做到的?

4

3 回答 3

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您想要的次数。

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

于 2013-11-10T11:08:38.480 回答
3

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

因此,如果您想要一个可重用的“线程”,那么您实际上是在谈论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();

(这纯粹是为了说明目的!最好使用更复杂的机制来运行“可运行对象”,例如由其中一个ExecutorService类提供的机制,它将以一种避免它们终止的方式管理实际线程。 )

于 2013-11-10T11:37:56.890 回答
2

一个javaThread不能运行两次。一旦它已经启动并完成它的工作,它就不能再次启动(调用方法start将失败)。所以你必须创建一个Thread(使用相同的Runnable)的新实例并启动它。

于 2013-11-10T11:06:49.133 回答