我遇到了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) {}
}
}
}
}
答案 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是如何工作的,但是我也看到你不了解一些基础知识,可能你应该从一些初学者的书开始,关于变量引用,继承,集合和之后再回到这个任务。