队列不使用线程?

时间:2010-09-15 03:11:38

标签: java multithreading queue

我有以下代码,只有当它至少有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。

4 个答案:

答案 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)

...原来我必须在线程上进行同步才能使其工作,因为队列是由链表实现的。

但是为什么打印声明会起作用呢?