队列不适用于线程?

Posted

技术标签:

【中文标题】队列不适用于线程?【英文标题】:Queue not working with thread? 【发布时间】:2010-09-15 03:11:38 【问题描述】:

我有以下代码,仅当队列至少有 2 个元素时才从队列中检索第一个元素。出于某种原因,它没有轮询第一个元素。但是,如果我在那里添加一个打印语句,它将打印和轮询。该方法在一个线程中,并且有另一个线程向队列中添加元素,该线程从队列中读取。

...
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)或者随机打印语句,它就会轮询出数据并打印出来

感谢任何输入。

【问题讨论】:

Loop doesn't see changed value without a print statement 的可能重复项 【参考方案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; 
             
         
    
 

这将防止您的多个线程在不适当的时间访问队列。

您还必须以类似的方式同步将项目添加到队列的线程。

【讨论】:

【参考方案2】:

看起来是同步问题。

【讨论】:

【参考方案3】:

您应该小心在线程之间使用共享资源。您应该考虑使用锁(令牌),在访问队列之前获取它并在使用后释放它。

【讨论】:

【参考方案4】:

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

但是为什么 print 语句可以使它起作用呢?

【讨论】:

以上是关于队列不适用于线程?的主要内容,如果未能解决你的问题,请参考以下文章

time.sleep 不适用于多线程

SetWindowsHookEx 不适用于线程 ID

安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

ThreadPoolTask Scheduler不适用于线程池

多个摄像头馈送不适用于 PyQt5 线程:

cellForRowAtIndexPath:setNeedsDisplay 不适用于在后台下载的图像,即使在主线程上调用它也是如此