-3

我正在制作一个程序,我需要一个线程停止,另一个线程启动。我的问题是,如果我 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
                }
4

2 回答 2

3

当线程停止时,您无法重新启动它。

  1. 但是,您可以创建并启动一个新线程。
  2. 此外,您可以暂停和恢复线程。

不推荐使用暂停和恢复线程(以及停止等)的 java 原语。请参阅此内容以了解如何实现所需的最佳效果 - http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html 检查如何执行相当于暂停和恢复的操作

我应该使用什么来代替 Thread.suspend 和 Thread.resume?

与 Thread.stop 一样,谨慎的方法是让“目标线程”轮询一个变量,该变量指示线程的所需状态(活动或挂起)。当所需的状态被挂起时,线程使用 Object.wait 等待。当线程恢复时,使用 Object.notify 通知目标线程。

示例代码在相同的答案中给出,以帮助您实现这一目标。

于 2013-03-31T05:27:51.227 回答
2

Thread#stop已弃用,您不应使用它。

来自 JavaDocs

stop()
已弃用。

这种方法本质上是不安全的。使用 Thread.stop 停止线程会导致它解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常沿堆栈传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。停止的许多用法应该由简单地修改一些变量以指示目标线程应该停止运行的代码替换。目标线程应该定期检查这个变量,如果变量指示它要停止运行,则以有序的方式从它的run方法返回。如果目标线程等待很长时间(例如,在条件变量上),应该使用中断方法来中断等待。有关详细信息,请参阅为什么不推荐使用 Thread.stop、Thread.suspend 和 Thread.resume?.

线程也是不可重入的,或者是一次性使用的。一旦run方法终止,它们将无法重新启动

于 2013-03-31T05:28:58.657 回答