java线程停止、暂停和恢复等状态的控制
2017-11-20 15:12
197 查看
JDK1.0定义了stop和suspend方法,stop用来直接终止线程,suspend会阻塞线程直到另一个线程调用resume.
stop和suspend都有一些共同的点:都试图专横的控制一个给定了的线程的行为。
从JDK1.2开始,这两个方法都被弃用了.stop天生就不安全,而经验告诉我们呢suspend方法会经常导致死锁。
网上有很多关于Java线程停止、暂停的文章,经过自己测试,在这里总结一下。针对不同使用场景选择合适的方法。
如果在run方法中只是处理一些逻辑,而没有sleep、wait等会导致线程阻塞的方法时,最好的办法是使用标识符讲线程停止
这里需要注意的是stopFlag 要用volatile 修饰,可以确保同一时刻只有同一个线程访问,具体volatile 修饰符的详解参阅《Java理论与实践:正确使用 Volatile 变量》
当run方法中有sleep等方法时,上边这种办法就不能立刻的将线程停止,就需要用到thread.interrupt()。
当调用thread.interrupt()时会立马停止Thread.sleep(100)。并抛出异常,这个时候在catch语句中加入break跳出循环体即可结束线程。
这里需要注意的是interrupt这个方法的作用只是抛出一个异常,并不会终止线程。
这里提供一个public方法setSuspend来设置暂停标识。如果为true时当前线程获取control对象的锁,并执行wait()方法。此时线程会一直处于阻塞状态,直到control对象
调用notify或者notifyAll方法。
stop和suspend都有一些共同的点:都试图专横的控制一个给定了的线程的行为。
从JDK1.2开始,这两个方法都被弃用了.stop天生就不安全,而经验告诉我们呢suspend方法会经常导致死锁。
网上有很多关于Java线程停止、暂停的文章,经过自己测试,在这里总结一下。针对不同使用场景选择合适的方法。
1、线程停止
正常情况下线程在执行完run方法之后就会停止,而且不会再恢复,但是我们可能会遇到这样的场景,在线程执行到某一时刻的时候就想立刻停止线程,如果在run方法中只是处理一些逻辑,而没有sleep、wait等会导致线程阻塞的方法时,最好的办法是使用标识符讲线程停止
public class MyThread extends Thread { private volatile boolean stopFlag = false; @Override public void run() { while (!stopFlag) { //doSomething } } public boolean isStopFlag() { return stopFlag; } public void setStopFlag(boolean stopFlag) { this.stopFlag = stopFlag; } }
这里需要注意的是stopFlag 要用volatile 修饰,可以确保同一时刻只有同一个线程访问,具体volatile 修饰符的详解参阅《Java理论与实践:正确使用 Volatile 变量》
当run方法中有sleep等方法时,上边这种办法就不能立刻的将线程停止,就需要用到thread.interrupt()。
@Override public void run() { while (!stopFlag) { //doSomething try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); break; } } }
当调用thread.interrupt()时会立马停止Thread.sleep(100)。并抛出异常,这个时候在catch语句中加入break跳出循环体即可结束线程。
这里需要注意的是interrupt这个方法的作用只是抛出一个异常,并不会终止线程。
2、线程暂停
这里用到Object的wait()方法和notify()和notifyAll()方法。先看代码public class MyThread extends Thread { private String control = "";//只是任意的实例化一个对象而已 private boolean suspend = false;//线程暂停标识 @Override public void run() { while (true) { synchronized (control) { if (suspend) { try { control.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //doSomething } } public void setSuspend(boolean suspend) { if (!suspend) { synchronized (control) { control.notifyAll(); } } this.suspend = suspend; } }
这里提供一个public方法setSuspend来设置暂停标识。如果为true时当前线程获取control对象的锁,并执行wait()方法。此时线程会一直处于阻塞状态,直到control对象
调用notify或者notifyAll方法。
相关文章推荐
- java线程停止、暂停和恢复等状态的控制
- java通过代码控制线程状态,解决线程不安全的问题。
- Java多线程 2 线程的生命周期和状态控制
- [并发并行]_[pthread]_[对工作线程进行简单控制-暂停-继续-停止]
- 线程状态与停止、阻塞(join、yield、sleep)、基本信息、优先级JAVA174-177
- Java—多线程(二)、线程的生命周期和状态控制
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
- java多线程suspend、resume暂停与恢复线程
- 第二十七篇:JAVA多线程机制之暂停、恢复和停止
- [并发并行]_[pthread]_[对工作线程进行简单控制-暂停-继续-停止]
- WPF控制动画开始、停止、暂停和恢复
- java线程(暂停、恢复、结束)前引
- Java多线程(二)、线程的生命周期和状态控制
- 线程状态与停止、阻塞(join、yield、sleep)、基本信息、优先级JAVA174-177
- java 线程的生命周期和状态控制
- Java多线程编程-停止线程 暂停线程
- java中判断线程是否是停止状态
- Java线程状态、线程停止、线程阻塞
- Java多线程、线程的生命周期和状态控制
- Java线程的生命周期和状态控制_动力节点Java学院整理