Thread.stop()不会停止线程

时间:2013-03-31 05:25:39

标签: java multithreading

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

2 个答案:

答案 0 :(得分:3)

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

  1. 但是,您可以创建并启动新主题。
  2. 此外,您可以暂停和恢复该帖子。
  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方法终止后,无法重新启动