(53)停止线程,interrupt()方法+标记修改
来源:互联网 发布:京东秒杀软件 编辑:程序博客网 时间:2024/06/06 01:09
stop方法已经过时。
如何停止线程?
run方法结束。开启多个线程运行,运行代码通常是循环结构。只要控制循环,就可以让run方法结束,也就是线程结束
public class StopThread implements Runnable { private boolean flag=true; public void run() { while(flag) { System.out.println(Thread.currentThread().getName()+"-----run"); } } public void changeFlag() { flag=false; }}public class StopThradDemo {public static void main(String[] args) { StopThread s=new StopThread(); Thread t1=new Thread(s); Thread t2=new Thread(s); t1.start(); t2.start(); int num=0; while(true) { if(num++ ==10) { s.changeFlag(); break; } System.out.println(Thread.currentThread().getName()+"-----"+num); }}}
之前线程不能停止的原因是:
while(true),一直都是可以运行run方法的。要让线程结束,就是让run结束,通过flag来控制run的运行与否,当主函数中num=10时,将flag置为flase,停止run运行,即停止了线程的运行
public class StopThread implements Runnable { private boolean flag=true; public synchronized void run() { while(flag) { try { wait(); }catch(InterruptedException e) { System.out.println(Thread.currentThread().getName()+"-----Exception"); } System.out.println(Thread.currentThread().getName()+"-----run"); } } public void changeFlag() { flag=false; }}主函数部分与上个相同
加同步和wait**出现这种运行结果的原因:**
当线程1获得执行权进入同步run方法时,就wait(),让出执行资格。线程2获得执行权,也有资格,进入同步run,wait,没人唤醒他们.那么主线程中num=10后,主线程结束,其他两个线程一直wait。
即一个特殊情况:
当线程处于冻结状态,就不会读取标记(因为一直等待,flag已经改为flase,但是因为等待,不读flag),那么线程不会结束。
对该问题的解决方法:
Thread类中的interrupt方法,强制将处于冻结状态的线程唤醒,因为是强制,所以会抛出异常InterruptedException,对其catch即可。
public class StopThread implements Runnable { private boolean flag=true; public synchronized void run() { while(flag) { try { wait(); }catch(InterruptedException e) { System.out.println(Thread.currentThread().getName()+"-----Exception"); } System.out.println(Thread.currentThread().getName()+"-----run"); } } public void changeFlag() { flag=false; }}public class StopThradDemo {public static void main(String[] args) { StopThread s=new StopThread(); Thread t1=new Thread(s); Thread t2=new Thread(s); t1.start(); t2.start(); int num=0; while(true) { if(num++ ==10) { //s.changeFlag(); t1.interrupt(); t2.interrupt(); break; } System.out.println(Thread.currentThread().getName()+"-----"+num); }}}
通过interrupt方法将冻结状态强制唤醒,虽然抛出了异常,但是也算让其运行了,但线程并没有结束,因为有while(flag),又都等待去了。
要让线程结束的最终方法是:
catch(InterruptedException e) { System.out.println(Thread.currentThread().getName()+"-----Exception"); flag=false; }
当没有指定的方式让冻结状态的线程回复到运行状态时,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让先承认那个结束。
Thread类提供该方法:interrupt();
阅读全文
0 0
- (53)停止线程,interrupt()方法+标记修改
- java多线程(三)停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止java线程方法,小心interrupt
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- [转]停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- 停止Java线程,小心interrupt()方法
- JAVA——如何停止线程呢?(interrupt)
- 利用interrupt停止线程
- servlet之helloworld
- LeetCode刷题【Array】 Can Place Flowers
- NOIP2009 提高第三题 最佳贸易
- 差分约束系统
- android Rect类的使用
- (53)停止线程,interrupt()方法+标记修改
- 机器学习笔记之过拟合问题
- pytorch GAN生成对抗网络
- poj 3279(翻转问题贪心)
- 机器学习中几种损失函数的分析
- idea 配置远程tomcat断点调试
- Python中如何实现分层抽样
- Linux下java编译运行时引用第三方jar包的方法
- java 简易的万年历