Java - 两次运行线程[关闭]

Posted

技术标签:

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

From another post:

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

这是怎么做到的?

【问题讨论】:

看看这个:docs.oracle.com/javase/tutorial/essential/concurrency 如何创建线程实例并在第一次运行? arashmd.blogspot.com/2013/06/java-threading.html Martin 会说“如果您希望线程运行两次,请在线程函数中的所有现有代码周围放置一个 for 循环”。 每个线程只运行它的Runnable,并不关心它是否与其他线程相同,因为每个线程都有其私有堆栈。例如检查this example 【参考方案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 类之一提供的,它将管理实际线程避免它们终止的方式。)

【讨论】:

以上是关于Java - 两次运行线程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

tomcat关闭后线程依然运行解决办法

Java -- 每日一问:一个线程两次调用start()方法会出现什么情况?

java线程中的并发[关闭]

MFC 如何在主线程中判断子线程是不是运行,运行则关闭子线程?

请问JMeter能不能比较两次测试运行的结果,是否不能测试JavaScript?

Django 是两次初始化视图