Java 如何使用BlockingQueues
我遇到了阻止队列的问题。对于第一个循环,队列的大小返回为1,之后为零,因此存在一些问题。但变量“as”为空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
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
对象放在队列上。