程序a
public class VolatileThread extends Thread {
private int count = 1; public void setCount(int count){
this.count = count;
} public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
// System.out.println("123");
}
System.out.println("线程停止");
} public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(1000);
vt1.setCount(-1);
}
}
结果
进入run方法程序B
public class VolatileThread extends Thread {
private int count = 1; public void setCount(int count){
this.count = count;
} public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
System.out.println("123");
}
System.out.println("线程停止");
} public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(10);
vt1.setCount(-1);
}
}
结果
进入run方法
123
123
123
123
123
123
123
123
线程停止为什么程序b比程序a只是多了一条print语句就可以正确退出,然而程序a一直在运行部能正常退出
public class VolatileThread extends Thread {
private int count = 1; public void setCount(int count){
this.count = count;
} public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
// System.out.println("123");
}
System.out.println("线程停止");
} public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(1000);
vt1.setCount(-1);
}
}
结果
进入run方法程序B
public class VolatileThread extends Thread {
private int count = 1; public void setCount(int count){
this.count = count;
} public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
System.out.println("123");
}
System.out.println("线程停止");
} public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(10);
vt1.setCount(-1);
}
}
结果
进入run方法
123
123
123
123
123
123
123
123
线程停止为什么程序b比程序a只是多了一条print语句就可以正确退出,然而程序a一直在运行部能正常退出
解决方案 »
- 大家看看如何输出这几个图形...???
- combobox 上添加控件 问题, 急,帮帮忙
- JAVA中数据加密问题?
- 请教虚拟机究竟什么概念?是作为操作系统的一个进程起来吗?如果是这样,那么同一系统的两个进程共享一个虚拟机吗?如果是,他们用什么方
- 我刚学java可以用它做什么小程序吗?
- 请问:如何设置JLabel和JButton上的字体,大小和颜色?谢谢(在线等待!)
- 相当菜鸟的问题,得到答案马上给分。
- DTPicker问题
- 请大家推介一本visual age的好书,谢谢
- JLabel中文本换行问题
- java导入io类,运行会提示拒绝访问
- spring中使用cxf发布webservice服务报错
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
该方法中有同步操作 同步操作的内存语义和volatile关键字类似 会对内存可见性产生影响(当然在内存模型中保证可见性的应该是不同线程对同一个监视器的获取和释放, 严格来说这样是确保可见性的充分条件但是根据底层实现的不同却未必是必要条件, 因此就算只是单个线程中有类似这种操作也可能改变内存可见性, 只不过在规范中不做保证而已)
另一方面打印操作属于是会对外部产生可见的影响的操作 因为用户可以在控制台看见打印出来的内容 这类操作在内存模型中也是有一些特殊对待的 例如不会被重排序 所以也可能会对多线程运行效果产生不可预测的影响
从串行化执行来看,最终A线程应该停止执行。
每个线程会把数据缓存在本地内存,
DemoA中,主线程改变了count的值,但是run方法线程没有及时读取到这个值。还有就是,DemoB多了几个字节码指令,不知道是否与那几个指令有关系
楼主还可以使用volatile关键字,使while始终读取最新的count值。
当CPU资源轮到Java程序的时候,这两个线程是由JVM调度的。
JVM是怎样调度的呢?抢占式调度:让可运行池中优先级高的线程拥有CPU使用权,若可运行池中线程优先级一样则随机选择线程。
因此,理论上讲:不加syso也是可以停下的,只是因为JVM一直选择VolatileThread线程。
回到楼主的问题 我的回答是:因为JVM就是让VolatileThread线程跑,没让main线程跑。
要让循环停下的话,我这里提供两种方法
1. 调用.setPriority()方法设置线程优先级 不推荐
2 使用 volatile关键字 推荐!
你没运行代码吧,运行下代码你就知道了,main线程已经结束了,但是run方法线程还在运行。