java线程停止问题
来源:互联网 发布:淘宝最好的外贸原单店 编辑:程序博客网 时间:2024/04/27 01:26
线程的挂起操作suspend已经被java所摒弃,原因在于它会导致死锁,加入一个线程拥有了某个资源时被挂起,那么等待该资源释放的其他线程将会无法得到该资源,会陷入
死锁,那么和suspend配套使用的resume也被摒弃。
同时stop操作也会引起严重的系统错误,也被摒弃了,那么线程的停止问题就出现了。
想要终止某一个线程的最安全做法就是从它的run()方法中退出,那么调用interrupt()操作是成为终止线程的重要一步。
中断机制是一种协作机制,也就是说通过终端不能直接终止另一个线程,它只是告诉该线程需要停止这样一个操作,是否终端、以及终止的时机需要该线程自己处理。
所以可以使用一个变量来控制合适从run方法中退出。
根据How to stop a Thread具体的做法是:
1.使用violate Thread变量来标识线程是否停止。
2.停止线程时,需要调用停止线程的interrupt()方法,因为线程有可能在wait()或sleep(), 提高停止线程的即时性。
3.对于blocking IO的处理,尽量使用InterruptibleChannel来代替blocking IO。
所以最好的实现为:
public class MyThreadTwo implements Runnable{Integer number;public volatile Thread myThread;MyThreadTwo(int number){this.number = number;}public void stopThread(){Thread tempThread = myThread;myThread = null;if(tempThread != null){tempThread.interrupt();}//Thread.currentThread().interrupt();//不能使用,currentThread是调用stopThread的线程}@Overridepublic void run() {// TODO Auto-generated method stubif(myThread == null){return;}try {Thread.sleep(10);//todo;dosomething if (Thread.currentThread().isInterrupted()) { throw new InterruptedException("Stopped by ifInterruptedStop()"); } } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} public static void main(String[] args) throws Exception { //必须是多个线程共享资源,同步才有意义Integer m = 40; MyThreadTwo thread = new MyThreadTwo(m); thread.myThread = new Thread(thread); thread.myThread.start(); Thread.sleep(100); thread.stopThread(); } }更加简洁的方案是使用boolean变量替换Thread
private volatile boolean running = true;public void stopThread(){running = false;}@Overridepublic synchronized void run() {// TODO Auto-generated method stubwhile(running){try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
public static void main(String[] args) throws Exception { Integer m = 40;MyThreadTwo runnable = new MyThreadTwo(m); Thread thread = new Thread(runnable); thread.start(); Thread.sleep(100);//等100ms后停止 runnable.stopThread(); thread.join();//等待结束 }
0 0
- java线程停止问题
- Java 线程的停止
- java线程停止【一】
- java线程停止【二】
- java线程停止【三】
- java线程停止【四】
- java 多线程 停止线程
- 如何停止JAVA线程
- Java之线程停止
- 如何停止JAVA线程
- java 线程的停止
- 如何停止JAVA线程
- 如何停止JAVA线程
- java 停止线程
- Java之线程停止
- 如何停止java线程
- java停止线程
- Java之线程停止
- Hibernate容器映射技术
- OS X中多PHP环境与Nginx配置问题
- 如何分清JSON解析什么时候该用JSONObject,什么时候该用JSONArray。
- maven-compiler-plugin 指定JDK版本和编码
- 获取当前控制器
- java线程停止问题
- HTML <button> 标签的 type 属性
- RxJava操作符(一)Creating Observables
- 7则心理寓言故事
- [php函数]--数组函数--array_chunk
- cxf+Spring的webservice应用
- NodeJS 使用Stream 方式 copy 大文件
- 第二种方法制作三角
- 如何发布Node模块到NPM社区