gpt4 book ai didi

java - 我是否必须同步访问 Java 中封装的线程安全数据结构?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:42 27 4
gpt4 key购买 nike

假设我有这样的东西(我有)

class QueBean extends JPanel {
private Queue queue = new LinkedBlockingQueue();

public Object poll(){
return queue.poll();
}
}

其中一些在自己的线程上运行

class ConsumerBean extends JPanel implements Runnable{
private QueBean queBean;

public synchronized run(){
while (true) {
Object result = queBean.poll();
if (result != null) {
jResultTextField.setText("got one");
}
wait(500);
}
}
}

QueBean 中的poll() 是否应该同步

最佳答案

存在线程问题,但不是您认为的问题——您发布的代码几乎肯定是非法的,最终会被锁定。

Swing 的核心规则之一是只允许一个线程接触“已实现”的组件。 (实现意味着在屏幕上或“几乎”在屏幕上)。

这个:

jResultTextField.setText("got one"); 

线程内部肯定是错误的——你就是做不到。查看 invokeLater 或 invokeAndWait 以将屏幕更新发送到 AWT 线程。

顺便说一句——在任何扩展组件的东西中都有线程感觉很有趣——看到这让我立即搜索冲突的位置,但它应该让任何长期的 Java 程序员一眼就感到不安——我建议您拆分一些类,将驱动 GUI( Controller )的部分与 GUI( View )完全分开。

关于java - 我是否必须同步访问 Java 中封装的线程安全数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2239200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com