无法重新启动线程[重复]
Posted
技术标签:
【中文标题】无法重新启动线程[重复]【英文标题】:Can't restart thread [duplicate] 【发布时间】:2013-05-24 05:59:49 【问题描述】:我有以下线程:
public void start()
isRunning = true;
if (mainThread == null)
mainThread = new Thread(this);
mainThread.setPriority(Thread.MAX_PRIORITY);
if (!mainThread.isAlive())
try
mainThread.start();
catch (Exception e)
e.printStackTrace();
在某些时候我想停止它的操作:
public void stop()
isRunning = false;
System.gc();
当再次调用start()
时会抛出以下异常:
java.lang.IllegalThreadStateException
指向mainThread.start()
代码行。
启动/停止线程的最佳方式是什么?我怎样才能使这个线程可重用?
谢谢!
【问题讨论】:
不要让它完成 - 只需在顶部循环一些 wait() 。当您希望它运行时,发出信号。 不只是调用 start(),而是输入:new Thread(this).start(); 【参考方案1】:一旦线程停止,您就无法在 Java 中重新启动它,但是您当然可以在 Java 中创建一个新线程来完成您的新工作。
即使您创建一个新线程或重新启动同一个线程,用户体验也不会有所不同(这在 Java 中是无法做到的)。
您可以阅读网站了解 API 规范http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html
您可能正在寻找的是Interrupts
。中断是对线程的指示,它应该停止正在做的事情并做其他事情。线程如何响应中断由程序员决定,但线程终止是很常见的。
要了解有关中断的更多信息,请阅读 Java 教程指南http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
【讨论】:
【参考方案2】:从您的代码片段看来,您正在使用带有Thread
属性的Runnable
类。您可以在下面使用挂起/恢复,而不是使用停止/启动:
private boolean isPaused;
public void run()
while (!isRunning)
// do your stuff
while (isPaused)
mainThread.wait();
public void suspend()
isPaused = true;
public void resume()
isPaused = false;
mainThread.notify();
我没有添加 synchronized
块来保持代码小,但您需要添加它们。
【讨论】:
以上是关于无法重新启动线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章
尝试重新启动线程时发生 ThreadStateException