3

说我有这样的事情(我有)

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);
        }
    }
}

我应该在poll()吗?QueBeansynchronized

4

4 回答 4

6

有一个线程问题,但不是你想的那样——你发布的代码几乎肯定是非法的,最终会被锁定。

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

这:

jResultTextField.setText("got one"); 

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

顺便说一句——在任何扩展组件的东西中都有线程感觉很有趣——看到这导致我立即搜索冲突的位置,但它应该让任何长期使用 Java 程序员的人一目了然——我建议你将您的类分开一些,并将驱动您的 GUI(控制器)的部分与 GUI(视图)完全分开。

于 2010-02-10T18:15:47.097 回答
2

不,没有必要。由于您的poll方法除了调用线程安全方法之外什么都不做,因此不会有数据损坏的可能性。

于 2010-02-10T18:07:10.843 回答
2

在这种情况下,不需要外部同步。阅读BlockingQueue合同:

BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。

于 2010-02-10T18:17:32.357 回答
1

你不需要这样做,只要queue不改变QueBean.

此外,除非您尝试实现某种微不足道的速率限制,否则您的代码中不需要wait(500)。由于队列被阻塞,这是多余的。

于 2010-02-10T18:14:24.120 回答