Java - 运行线程两次

8

来自另一篇文章:

如果一个线程需要被运行多次,则应该创建一个新的线程实例并调用其 start 方法。

如何实现?


2
请查看:http://docs.oracle.com/javase/tutorial/essential/concurrency/ - pablochan
你如何创建一个线程实例并第一次运行它? - NilsH
2
http://arashmd.blogspot.com/2013/06/java-threading.html - user2511414
马丁会说:“如果你想让一个线程运行两次,就在线程函数中把所有现有的代码放在一个for循环中。” - Martin James
1
每个线程只运行它自己的Runnable,并不关心它是否与其他线程相同,因为每个线程都有它自己的私有堆栈。例如,请查看此示例 - user2511414
检查这个答案链接 - DnA
3个回答

6

我建议使用另一层抽象层,使用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);
}

只需将您的任务尽可能多地转储到“服务”中即可。
“ExecutorService”是线程池-它有许多“Thread”,它们按照任务的到来进行处理。这消除了生成新“Thread”的开销,因为它会缓存它们。

2
尽管这个答案对我来说似乎有点离题,但我很欣赏每一个解释ExecutorService并支持它胜过通常的“线程”的陈述,因为仍然有太少的人知道新的花哨的并发API。+1! - isnot2bad

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

2

Java中的Thread不能被重复运行。一旦它启动并完成工作,就无法再次启动(调用方法start将失败)。因此,您将不得不创建一个新的Thread实例(使用相同的Runnable)并启动它。


1
你读了描述还是只看了标题?我说我不明白这意味着什么... - Airflow46
1
你不明白什么?我已经解释过了,你需要创建一个新的Thread实例并启动它。就是这样,没有更多也没有更少。你真的想让我写下这两行代码吗? - isnot2bad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接