我有以下代码,只有当它至少有2个元素时,它才会从队列中检索第一个元素。出于某种原因,它不会轮询第一个元素。但是,如果我在那里添加一个print语句,它将打印并轮询。该方法位于一个线程中,还有另一个线程向队列添加元素,该线程从队列中读取。
...
public void run(){
while(beginning){
int size = queue.size();
// adding this will cause the program to enter if below: System.out.println(size);
if(size > 1){
System.out.println("data: " + queue.poll());
beginning = false;
}
}
}
...
如果添加了println语句,它将打印
1
1
....
2
数据:数据
如果删除println语句,则不会打印任何内容。
实际上,只要我在那里放一些东西,一个thread.sleep(1)或一个随机的print语句,它就会查出数据并将其打印出来
任何输入的Thanx。
答案 0 :(得分:1)
您需要在队列对象上进行同步:
public void run(){
while(beginning){
synchronized (queue) {
int size = queue.size();
// adding this will cause the program to enter if below: System.out.println(size);
if(size > 1){
System.out.println("data: " + queue.poll());
beginning = false;
}
}
}
}
这将阻止您的多个线程在不正确的时间访问队列。
您还必须以类似的方式将正在添加项目的线程同步到队列中。
答案 1 :(得分:0)
看起来像是同步问题。
答案 2 :(得分:0)
在线程之间使用共享资源时应该小心。您应该考虑使用锁(令牌),在访问队列之前获取它并在使用后释放它。
答案 3 :(得分:0)
...原来我必须在线程上进行同步才能使其工作,因为队列是由链表实现的。
但是为什么打印声明会起作用呢?