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

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或不?

有帮助吗?

解决方案

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

  

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

其他提示

有一个线程的问题,而不是一个你想 - 你发布的代码几乎可以肯定是非法的,并最终锁定了

一摆动的核心规则是只有一个线程被允许触摸“实现”的组件。 (在屏幕上或屏幕上的“几乎”实现方式)。

此:

jResultTextField.setText("got one"); 

在一个线程是相当肯定是错误的 - 你不能做到这一点。检查出的invokeLater或invokeAndWait让你的屏幕更新到您的AWT线程。

顺便说一句 - 那感觉好笑具有任何线程延伸的组成部分 - 导致我立即搜索冲突是地方见状,但它应该作出任何长期Java程序员不安在glance--我建议你分手了你的一些类和驱动部分完全分离你的图形用户界面(控制器)从GUI(查看)..

没有。没有必要。由于您的poll方法不做任何事,除了调用线程安全的方法,也没有数据损坏的可能性。

您不需要做这个,只要queueQueBean改变。

另外,除非你想实现某种琐碎率limitng的,你不需要在代码中wait(500)。这是多余的,由于队列中阻塞。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top