我有一个小程序,向用户提供 GUI 来选择文件,然后该程序根据文件内容执行并相应地显示结果。
这是在主线程中运行的循环(main()
方法):
do {
args = fg.getFile();
} while (!fg.started);
fg.started
是一个 boolean 变量,当用户选择文件并按下“开始”按钮时设置为 true。
但是,除非我在循环中放置一个随机任务,否则这不起作用:
do {
args = fg.getFile();
System.out.println("");
} while (!fg.started);
这有效。
谁能给我解释一下这是为什么吗?
我知道一个涉及 Thread 类的解决方案,带有 notify()
和 wait()
等,但现在我只是对此感到好奇。
最佳答案
fg.started is a boolean variable set to true when the user has selected a file and presses the "start" button.
However, this does not work UNLESS I put a random task inside the loop:
这是因为两个线程正在访问 started
字段,但没有内存同步。您没有显示 fg.started
的定义,但我怀疑您需要确保它是 volatile
。您还可以考虑切换到 AtomicBoolean
。这是Java tutorial about memory synchronization .
volatile boolean started;
多线程应用程序的问题在于,程序的某些部分可以在具有自己的本地内存缓存的不同处理器中运行。每当线程修改或访问共享字段时,都需要显式同步以确保它们不仅仅查看该字段的本地缓存值。
当您添加 System.out.println(...)
时,它会起作用,因为 PrintStream
的方法是同步的,因此您要添加间接内存同步。
making getFile() synchronized fixed it, thanks. Care to explain why? :)
因为,就像 System.out.println(...)
一样,您正在添加间接同步。
关于java - 主线程在无限循环中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22989633/