bla*_*ank 3 java concurrency synchronized
说我有这样的事情(我也这样做)
class QueBean extends JPanel {
private Queue queue = new LinkedBlockingQueue();
public Object poll(){
return queue.poll();
}
}
Run Code Online (Sandbox Code Playgroud)
其中一些运行在自己的线程上
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我应该poll()在QueBean是synchronized或不是?
有一个线程问题,但不是你认为的问题 - 你发布的代码几乎肯定是非法的,最终会锁定.
Swing的核心规则之一是只允许一个线程触及"已实现"的组件.(已实现意味着在屏幕上或"几乎"在屏幕上).
这个:
jResultTextField.setText("got one");
Run Code Online (Sandbox Code Playgroud)
在一个线程内部肯定是错的 - 你就是做不到.检查invokeLater或invokeAndWait以获取您的AWT线程的屏幕更新.
顺便说一下 - 在扩展组件的任何东西中都有线程感觉很有趣 - 看到这导致我立即搜索冲突的位置,但是它应该让任何长期的Java程序员一眼就感到不安 - 我建议你将您的类拆分一些,并将驱动GUI(Controller)的部分与GUI(视图)完全分开.