Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用BlockingQueues_Java - Fatal编程技术网

Java 如何使用BlockingQueues

Java 如何使用BlockingQueues,java,Java,我遇到了阻止队列的问题。对于第一个循环,队列的大小返回为1,之后为零,因此存在一些问题。但变量“as”为空 public class Board extends JPanel { private myClass mc; private Thread combatThread; final BlockingQueue<myClass> queue = new LinkedBlockingQueue<myClass>(); public Bo

我遇到了阻止队列的问题。对于第一个循环,队列的大小返回为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) {}
            }
        }
    }
}
公共类板扩展JPanel{
私人myClass mc;
私有线程组合线程;
final BlockingQueue=新建LinkedBlockingQueue();
公共委员会(){
mc=新的myClass();
mc.添加(1);
mc.添加(2);
combatThread=新线程(新cThread(queue));
test();
}
公共无效测试(){
试一试{
队列添加(mc);
}捕获(异常e1){}
combatThread.start();
}
公共类cThread实现Runnable{
私人myClass as;
公共cThread(阻塞队列){
}
公开募捐{
while(true){
试一试{
as=queue.poll();//as为空
}捕获(例外e){}
}
}
}
}
在构造函数中

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) {}
            }
将“as”变量引用指定给“mc”。但如何知道这个对象是任何类型的队列,为什么您认为asArray方法应该有效?您是实现它还是在某个地方继承它?我建议你不要。但如果你问起封锁队列,你就乱七八糟了

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

这个构造函数也很混乱,它什么都不做,为什么要使用它

 public cThread(BlockingQueue queue) {

        }

我认为你应该读一些类似的东西,看看BlockingQueue是如何工作的,但我也看到你不了解一些基础知识,可能是你应该从一些关于变量引用、继承、集合的初学者书籍开始,然后再回到这个任务

如果队列为空,则立即返回
null
。如果希望线程等待队列中有内容,请使用而不是
poll()
。很抱歉,我应该重新措辞。如果我打印'as',它应该包含1和2,但它打印空。换句话说,as.array[1]抛出空指针错误。因此,Jesper的注释。请注意,您只在
test()
方法中将一个对象添加到队列中。我不知道
myClass.add()
做了什么,但您只创建了一个
myClass
对象放在队列上。