【问题标题】:Java - Running a thread twice [closed]Java - 两次运行线程[关闭]
【发布时间】:2013-11-22 05:26:42
【问题描述】:

From another post:

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

这是怎么做到的?

【问题讨论】:

标签: java multithreading


【解决方案1】:

我会使用另一层抽象。使用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 是一个线程池 - 它有许多 Threads 来处理任务。这消除了生成新 Threads 的开销,因为它缓存了它们。

【讨论】:

  • 虽然这个答案对我来说似乎有点离题,但我很欣赏每一个解释 ExecutorService 的陈述,并且比通常的“线程”更喜欢它,因为仍然很少有人知道新的花哨的并发 API。 +1!
【解决方案2】:

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

【讨论】:

  • 您是否阅读了描述或只阅读了标题?我说我不明白这是什么意思...
  • 你不明白什么?我解释说你必须创建一个新的 Thread 实例并启动它。它不多不少。你真的要我写下这两行代码吗?
【解决方案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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多