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
是一个线程池 - 它有许多 Thread
s 来处理任务。这消除了生成新 Thread
s 的开销,因为它缓存了它们。
【讨论】:
虽然这个答案对我来说似乎有点离题,但我很欣赏每一个解释 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 - 两次运行线程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Java -- 每日一问:一个线程两次调用start()方法会出现什么情况?
MFC 如何在主线程中判断子线程是不是运行,运行则关闭子线程?