第二十七篇:JAVA多线程机制之暂停、恢复和停止
2017-08-14 13:10
288 查看
在JDK1.2以前的版本如果要实现线程的暂停、恢复和停止的方法分别是suspend()、resume()、stop()。但是从JDK1.2以后这些方法已经被遗弃,因为它们有可能造成严重的系统错误和异常。
首先suspend()方法不会释放线程所占用的资源。如果使用该方法将某个线程挂起,则可能会使其他等待资源的线程死锁。而resume()方法本身并无问题,但是不能独立于suspend()方法存在。
其次调用stop()可能会导致严重的系统故障。因为该方法会使线程立刻中断指令执行,不管这段方法是否执行完毕。如果这个线程正在做重要的操作,对程序的运行起着支撑作用,这时如果突然中断其执行则会导致系统崩溃。
现在,这些方法已经不适合挂起和终止线程了,但是可以在run()方法中设置一些标志,通过在线程内部检测标志判断并调用wait()方法和notify()方法操作线程的挂起、恢复和正常终止。
下面通过示例来演示这些操作。
运行结果:
测试线程第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次运行…
主线程终止…
首先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次运行…
主线程终止…
相关文章推荐
- java多线程被废除的暂停和恢复
- Java多线程程序休眠、暂停与停止
- 多线程——(一):暂停、恢复、停止线程较好的方式,sleep/wait/yield区别
- Java多线程的暂停与恢复
- 【Java多线程】浅谈多线程机制(二)之正确停止线程
- java线程停止、暂停和恢复等状态的控制
- java多线程程序休眠、暂停、停止
- JAVA多线程机制之暂停、恢复和停止
- java线程停止、暂停和恢复等状态的控制
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
- Java/Android倒计时(开始,暂停,恢复,停止)
- java多线程---停止、暂停一个线程
- java开发多线程机制
- Java的多线程机制系列:(二)缓存一致性和CAS
- JAVA 多线程,同步机制
- java多线程中的异常处理机制简析
- Android中的java层的线程暂停和恢复实现
- 从头认识java-17.2 基本的线程机制(1)-初识多线程-1
- Java线程优先级和线程暂停恢复的问题
- JAVA多线程之线程的挂起与恢复(suspend方法与resume方法)