如何使用BlockingQueues

时间:2015-06-13 12:30:22

标签: java

我遇到了BlockingQueues的问题。对于第一个循环,队列的大小返回为1,然后在那之后它就为零。但变量' as'一片空白。

public class Board extends JPanel {
    private myClass mc;
    private Thread combatThread;
    final BlockingQueue<myClass> queue = new LinkedBlockingQueue<myClass>();

    public Board() {
        mc = new myClass();
        mc.add(1);
        mc.add(2);
        combatThread = new Thread(new cThread(queue));

        test();
    }

    public void test() {    
        try {
            queue.add(mc);
        } catch(Exception e1) {}
        combatThread.start();
    }


    public class cThread implements Runnable {
        private myClass as;

        public cThread(BlockingQueue queue) {

        }

        public void run() {
            while( true ){
                try {
                    as = queue.poll(); //as is null
                } catch (Exception e) {}
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

在构造函数

public Board()

你创建一个对象 - mc,并给它两个值(1,2)

方法

中的

public void test()

将这一个对象添加到队列

queue.add(mc);

所以当线程启动时,队列只包含一个(myClass)mc实例引用,这个mc对象应该包含1和2个值(我不确定,因为你没有给MyClass源代码)。

中的第一次迭代
  while( true ){
                try {
                    as = queue.poll(); //as is null
                } catch (Exception e) {}
            }

将&#34;指定为&#34;变量引用&#34; mc&#34;。但是如何知道这个对象是什么类型的Queue,为什么你认为asrray方法应该工作?你实现它还是继承某个地方?我建议你不要。但是,如果你问起BlockingQueue,那你就是一团糟。

myClass - 你错了。班级名称应以大写字母开头。阅读Java名称约定。

这个构造函数也会混淆,它什么都不做,为什么要使用它?

 public cThread(BlockingQueue queue) {

        }

我认为你应该阅读类似http://javarevisited.blogspot.com/2012/02/producer-consumer-design-pattern-with.html的东西,看看BlockingQueue是如何工作的,但是我也看到你不了解一些基础知识,可能你应该从一些初学者的书开始,关于变量引用,继承,集合和之后再回到这个任务。