JAVA多线程机制之暂停、恢复和停止

来源:互联网 发布:淘宝发货用什么软件 编辑:程序博客网 时间:2024/06/04 20:02

在JDK1.2以前的版本如果要实现线程的暂停、恢复和停止的方法分别是suspend()、resume()、stop()。但是从JDK1.2以后这些方法已经被遗弃,因为它们有可能造成严重的系统错误和异常。
首先suspend()方法不会释放线程所占用的资源。如果使用该方法将某个线程挂起,则可能会使其他等待资源的线程死锁。而resume()方法本身并无问题,但是不能独立于suspend()方法存在。
其次调用stop()可能会导致严重的系统故障。因为该方法会使线程立刻中断指令执行,不管这段方法是否执行完毕。如果这个线程正在做重要的操作,对程序的运行起着支撑作用,这时如果突然中断其执行则会导致系统崩溃。
现在,这些方法已经不适合挂起和终止线程了,但是可以在run()方法中设置一些标志,通过在线程内部检测标志判断并调用wait()方法和notify()方法操作线程的挂起、恢复和正常终止。
下面通过示例来演示这些操作。

/** * 线程控制 *  * @author jianggujin * */public class ThreadCtrlDemo extends Thread{   private final int STOP = -1;   private final int SUSPEND = 0;   private final int RUNNING = 1;   private int status = 1;   private long count = 0;   public ThreadCtrlDemo(String name)   {      super(name);   }   @Override   public synchronized void run()   {      // 判断是否停止      while (status != STOP)      {         // 判断是否挂起         if (status == SUSPEND)         {            try            {               // 若线程挂起则阻塞自己               wait();            }            catch (InterruptedException e)            {               System.out.println("线程异常终止...");            }         }         else         {            count++;            System.out.println(this.getName() + "第" + count + "次运行...");            try            {               Thread.sleep(100);            }            catch (InterruptedException e)            {               System.out.println("线程异常终止...");            }         }      }   }   /**    * 恢复    */   public synchronized void myResume()   {      // 修改状态      status = RUNNING;      // 唤醒      notifyAll();   }   /**    * 挂起    */   public void mySuspend()   {      // 修改状态      status = SUSPEND;   }   /**    * 停止    */   public void myStop()   {      // 修改状态      status = STOP;   }   public static void main(String[] args)   {      ThreadCtrlDemo demo = new ThreadCtrlDemo("测试线程");      demo.start();      try      {         Thread.sleep(2000);      }      catch (InterruptedException e)      {         System.out.println("主线程异常终止...");      }      System.out.println("测试线程即将被挂起...");      demo.mySuspend();      try      {         Thread.sleep(1000);      }      catch (InterruptedException e)      {         System.out.println("主线程异常终止...");      }      System.out.println("测试线程即将被唤醒...");      demo.myResume();      try      {         Thread.sleep(1000);      }      catch (InterruptedException e)      {         System.out.println("主线程异常终止...");      }      System.out.println("终止测试线程...");      demo.myStop();      System.out.println("主线程终止...");   }}

运行结果:
测试线程第1次运行…
测试线程第2次运行…
测试线程第3次运行…
测试线程第4次运行…
测试线程第5次运行…
测试线程第6次运行…
测试线程第7次运行…
测试线程第8次运行…
测试线程第9次运行…
测试线程第10次运行…
测试线程第11次运行…
测试线程第12次运行…
测试线程第13次运行…
测试线程第14次运行…
测试线程第15次运行…
测试线程第16次运行…
测试线程第17次运行…
测试线程第18次运行…
测试线程第19次运行…
测试线程第20次运行…
测试线程即将被挂起…
测试线程即将被唤醒…
测试线程第21次运行…
测试线程第22次运行…
测试线程第23次运行…
测试线程第24次运行…
测试线程第25次运行…
测试线程第26次运行…
测试线程第27次运行…
测试线程第28次运行…
测试线程第29次运行…
测试线程第30次运行…
终止测试线程…
测试线程第31次运行…
主线程终止…

0 0
原创粉丝点击