java - 主线程在无限循环中停止

标签 java multithreading loops user-interface

我有一个小程序,向用户提供 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/

相关文章:

java - 使用 Double 列表对相应的 String 列表进行排序

java - 找出三个整数中的最大值并知道选择哪一个

c++ - 多线程和多进程应用程序的锁定机制有什么区别?

linux - 在 ftp 命令内循环

PHP PDO foreach 循环提供额外的表输出

java - While 循环和套接字

java - 如何关联两个相等的子元素?

java - Hbase 1.0.0连接池

c - c中的pthreads到进程

c++ - 大 O 符号混淆(C++)