热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

当我尝试在Java中杀死一个线程时会发生奇怪的事情吗?

我有这个“串行”类,它扩展了与串行端口一起使用的线程。在run()方法中,我首先打开端口,设置所有串行参数并添加一个SerialPortEventListener。然后我只是放了一个

我有这个“串行”类,它扩展了与串行端口一起使用的线程。在 run() 方法中,我首先打开端口,设置所有串行参数并添加一个 SerialPortEventListener。然后我只是放了一个 while(go),其中 go 是私有的(因此只有类可以看到它)布尔实例设置为 true。我有一个 kill 方法,它不仅关闭端口并删除 SerialEventListener,而且还将“go”设置为 false,因此线程应该停止。现在,事情开始变得奇怪了:如果我在 while(go) 中放入 System.out.println(something),当我调用 kill() 方法时,Thred 会停止,但如果我不这样做,它会保持活动状态. 你对它为什么会这样工作以及如何解决它有什么想法吗?

while(go) {
System.out.println("in");
}

public void kill(){
go = false;
try {
this.serialPort.removeEventListener();
this.serialPort.closePort();
} catch (SerialPortException e) {
e.printStackTrace();
}
}

回答

除非go声明为 volatile,否则不能保证 while 循环(或其他任何东西)会读取当前值。

声明为

volatile boolean go;

然后它应该可以工作(除非还有其他事情没有发布)。并且这样做并不能减轻进行适当同步的要求。



  • @DavidePasero To be blunt, if you do not understand `volatile` (and the `Atomic…` classes) you should *not* be doing threaded/concurrent programming. Read the Oracle tutorials, search and study posts on this site, and most importantly, read the classic book [*Java Concurrency in Practice*](https://jcip.net/) by Brian Goetz, et al.





推荐阅读
author-avatar
小水沉伦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有