作者:小水沉伦 | 来源:互联网 | 2023-10-12 14:56
我有这个“串行”类,它扩展了与串行端口一起使用的线程。在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.