【发布时间】:2021-04-24 19:58:51
【问题描述】:
我有这个“串行”类,它扩展了与串行端口一起工作的线程。在 run() 方法中,我首先打开端口,设置所有串行参数并添加一个 SerialPortEventListener。然后我只是在 go 是私有的(所以只有类可以看到它)布尔实例设置为 true 的地方放了一段时间(go)。我有一个 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();
}
}
【问题讨论】:
-
你应该永远在没有保护的情况下从两个线程访问同一个变量。正如您已经发现的那样,这是灾难的根源。你需要某种形式的synchronization。
-
我该怎么做?我可以将同步词添加到 kill() 方法吗?
-
你需要同步all对变量的访问,而不仅仅是
kill中的修改。当您在run中访问它时,它还需要同步(使用块,不是整个方法;如果您同步整个run方法,您将永远无法调用@987654328 @) -
感谢您的宝贵时间,能否请您提供一个示例代码?如您所知,我只在 while(go)(在方法 run() 中)和 kill() 中访问变量“go”
-
The section on sleep and yield 在 Java 语言规范中解释得很好。
标签: java multithreading