Java中要停止一个线程通过协作的方式,具体过程是这样,当想要停止线程时,调用线程的某个方法来设置某个标志变量,线程运行时会不断地检查这个
变量,当它的值为true时就退出。需要注意的是这个标志变量必须设置为volatile,这应该属于常识了。书上都讲到,如果不设置为
volatile,则该线程可能永远都不会退出,可是在实际程序中很少会观察到这类现象。“你只要记住就行了”,这个理由并不是对所有人都那么有说服力。
我这里的例子就是要说明volatile的确是不可缺少的。
这个例子其实来自于《Effective Java》:
-
import
java.util.concurrent.*;
-
-
public
class
Test {
-
private
static
boolean
stop =
false
;
-
public
static
void
main(String[] args)
throws
Exception {
-
Thread t = new
Thread(
new
Runnable() {
-
public
void
run() {
-
int
i =
0
;
-
while
(!stop) {
-
i++;
-
-
}
-
}
-
});
-
t.start();
-
-
Thread.sleep(1000
);
-
TimeUnit.SECONDS.sleep(1
);
-
System.out.println("Stop Thread"
);
-
stop = true
;
-
}
-
}
编译:
运行:
-
C:>java Test
-
Stop Thread
-
-
C:>
程序退出了,似乎有没有volatile都一样,接着用下面命令运行:
-
C>java -server Test
-
Stop Thread
这时就永远不会退出了。"-server"参数会启动server虚拟机,我的机器上默认启动的是client虚拟机,默认启动哪种虚拟机依赖于机
器的配置,配置高的机器可能就会默认启动server虚拟机。server虚拟机会对程序做更多优化,对于上面的程序,它会将:
-
int
i =
0
;
-
while
(!stop) {
-
i++;
-
}
优化成:
-
int
i =
0
;
-
while
(
true
) {
-
i++;
-
}
因为stop在整个线程中没有不会改变,这样程序就永不退出了。关于server虚拟机和client虚拟机的区别可以参看这篇文章
。如果你声明stop为volatile的,就可以禁止编译器做这种优化。
我将while循环中的打印hello的语句取消注释,stop不声明为volatile,使用server虚拟机,这时程序仍然可以退出。why?
java -server xxx 提示 Error: no `server' JVM at 错误
解决方式:
拷贝 C:\Program Files\Java\jdk1.6.0_21\jre\bin 内的"server"目录到 C:\Program Files\Java\jre6\bin 中
转自 :http://marlonyao.iteye.com/blog/636599
分享到:
相关推荐
该项目为店小二服务平台提供的数字玛丽设计源码,采用Java语言开发,共包含20个文件,其中10个XML配置文件、7个Java源文件以及2个Git忽略文件。该平台旨在提供高效便捷的服务,适用于相关业务场景。
本项目是一款利用Python、HTML、JavaScript和CSS技术构建的豆瓣TOP250电影可视化设计源码,共包含59个文件,涵盖16个Python脚本、13个JavaScript脚本、13个HTML页面、4个CSS样式表、2个JSON数据文件、2个图片文件以及其他辅助文件。该项目旨在以直观的方式展示豆瓣TOP250电影的详细信息,适用于对电影数据进行分析和展示的用户。
本项目为基于Java的商城微服务框架设计源码,集成了platform中台基础组件库,实现一键式接入微服务功能。项目包含236个文件,涵盖154个Java源文件、41个XML配置文件、10个属性文件、7个YAML配置文件、5个SQL脚本文件以及少量HTML、Shell脚本、文本和Git忽略文件等,旨在为商城业务提供高效、灵活的微服务架构支持。
数据手册-74HC02-datasheet.zip
mmexport1728042361260.mp4
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
数据手册-CN_DS1302-datasheet.zip
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
数据手册-AT24CXX-datasheet.zip
该项目为SmoothNLP,一个集Java、Python、HTML于一体的NLP技术工具集设计源码,总计125个文件,包括81个Java源文件、16个Python脚本、7个Markdown文件、3个Jupyter Notebook文件、3个PNG图片、2个CSV文件,以及其他必要配置文件。SmoothNLP专注于可解释的NLP推理,旨在为用户提供易于理解和解释的自然语言处理技术。
圆管倒角机_三维3D设计图纸.zip
毕设答辩 参考的ppt
悬臂码垛机_三维3D设计图纸.zip
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
hfut自然语言处理-test1-语料库的收集与整理
该项目为基于Unity 3D导出的layaair游戏资源,采用JavaScript实现,支持动态加载至舞台。项目包含357个文件,涵盖53个JavaScript文件、21个JSON配置文件、15个PNG图片文件以及相关TypeScript、HTML、CSS和LayaAir配置文件。设计源码旨在实现3D游戏资源的高效加载与实时展示。
2024-10-05 20_42_57-1d975af1.mp3
冬奥会科普平台 毕业设计 源码+数据库+论文(JAVA+SpringBoot+Vue.JS) 启动教程:https://www.bilibili.com/video/BV11ktveuE2d
该项目为基于Java的Android应用,专注于自定义View控件的九宫格解锁功能。它包含44个文件,其中包括14个XML布局文件、13个PNG图片资源、5个Java源代码文件、3个Gradle配置文件、2个Git忽略规则文件、2个属性文件、1个Markdown文件、1个Android项目文件和1个JAR库文件。该设计源码适用于开发具有独特解锁界面的Android应用。