多线程中线程停止的问题
来源:互联网 发布:一元秒杀包邮 淘宝 编辑:程序博客网 时间:2024/05/16 15:12
问题
在学习多次线程的过程,使用中断标志来控制线程的停止,结果出现子线程不会中断一直在运行
package pageWeb;public class ThreadDemo1 implements Runnable{public static void main(String[] args) throws InterruptedException {ThreadDemo1 t1 = new ThreadDemo1();Thread t = new Thread(t1, "thread1");t.start();Thread.currentThread().sleep(10);t1.cancel();System.out.println("检查线程的运行状态标志flag:"+t1.flag);System.out.println(t.getName()+" is interrupt: "+t.isInterrupted()); }boolean flag = true;int i=0;@Overridepublic void run() {System.out.println("thread运行状态:"+flag);while(flag){i++;}System.out.println("输出结果: i= "+i);}public void cancel(){flag = false;}}
运行结果:
这是因为在java多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程
改变过的变量即使更新功能公共对象存储区的状态,可能造成问题,建议使用同步方法来获取flag。
修改后的代码如下:
package pageWeb;public class ThreadDemo1 implements Runnable{public static void main(String[] args) throws InterruptedException {ThreadDemo1 t1 = new ThreadDemo1();Thread t = new Thread(t1, "thread1");t.start();Thread.currentThread().sleep(10);t1.cancel();System.out.println("检查线程的运行状态标志flag:"+t1.flag);System.out.println(t.getName()+" is interrupt: "+t.isInterrupted()); }private boolean flag = true;private int i=0;@Overridepublic void run() {System.out.println("thread运行状态:"+flag);while(getFlag()){incrCount();}System.out.println("输出结果: i= "+i);}public synchronized boolean getFlag (){return flag;}private synchronized void incrCount(){i++;}public synchronized void cancel(){flag = false;}}
说明:
还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使flag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的
资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。
笔者曾经参与多个涉及到获取网络资源的java程式,经常遇到因为网络的阻塞引起的线程问题。
如果你的程式可能涉及到网络阻塞,或者有可能发生某种消息接受的阻塞。那么,请不要用这种方法来停止线程。
2. 另一个解释:
典型的多线程Happens-before Order问题,参考java语言规范-Happens-before Order。
针对这个demo而言,java1.5之后的规范推荐的解决方法是在共享属性前增加参数volatile 我也是一头雾水,先记着。。
阅读全文
0 0
- 多线程中线程停止的问题
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- java高级多线程编程(一)--关于线程的停止问题
- java高级多线程编程--关于线程的停止问题
- java高级多线程编程(一)--关于线程的停止问题
- java高级多线程编程--关于线程的停止问题
- java高级多线程编程(一)--关于线程的停止问题
- Java多线程 线程的停止
- 关于线程的停止问题
- Android的程序中,线程停止问题·
- 多线程编程:停止基于线程的服务
- Java 多线程 学习笔记 线程的停止
- java 多线程 停止线程
- 多线程(停止线程)
- 多线程学习-停止线程
- 多线程(停止线程)
- JAVA-多线程-停止线程
- 多线程---停止线程
- lnmp配置php环境用到的设置
- 三种基础排序算法及其拓展应用
- Identify Smith Numbers
- 华为P6安装Sygic
- 【51Nod 1789】跑的比谁都快
- 多线程中线程停止的问题
- Java中常用的设计模式
- USACO-Section1.5 SuperPrime Rib [质数]
- Roads and Libraries
- 西邮杯初赛
- PAT甲级 1006
- 分享马化腾在3Q大战后写给腾讯全体员工的一封信
- C++设计模式之观察者模式
- 简单使用makefile V1.0