我正在制作一个程序,我需要一个线程停止而另一个线程启动。我的问题是如果我执行t1.stop()而不是t1.start()我得到java.lang.IllegalThreadStateException
if (t1.isAlive() == true){
t1.stop();
// above I stop the thread and call another
t2.start();
System.out.println("t1 was playing");
}else{
t2.stop();
t1.start();
// above I stop the other thread and want to start the first thread again, but when I run the program I get the exception i said above
}
答案 0 :(得分:3)
当线程停止时,您无法重新启动它。
不推荐使用暂停和恢复线程的java原语(以及stop等)。了解如何实现最佳效果 - http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html 检查你如何做相当于暂停& amp;恢复
我应该使用什么而不是Thread.suspend和Thread.resume?
与Thread.stop一样,谨慎的方法是让“目标线程”轮询一个变量,指示线程的所需状态(活动或挂起)。当所需状态被挂起时,线程将使用Object.wait等待。当线程恢复时,使用Object.notify通知目标线程。
示例代码在相同的答案中给出,以帮助您实现此目的。
答案 1 :(得分:2)
Thread#stop
已弃用,您不应该使用它。
来自JavaDocs
停止()
已过时。
这种方法本质上是不安全的。停止了 Thread.stop的线程使它解锁所有的监视器 它已被锁定(作为未经检查的ThreadDeath的自然结果 异常传播到堆栈中)。如果以前有任何对象 受这些监视器保护的状态不一致,受损 对象变得对其他线程可见,可能导致 任意行为。停止的许多用法应该用代码替换 只需修改一些变量即可指示目标线程 应该停止运行。目标线程应检查此变量 定期,并以有序的方式从其运行方法返回,如果 变量表示它将停止运行。如果是目标线程 等待很长时间(例如,在条件变量上), 应该使用中断方法来中断等待。更多 信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?。
线程也是不可重入的,或者是单独使用的。 run
方法终止后,无法重新启动