队列不适用于线程?
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 语句可以使它起作用呢?
【讨论】:
以上是关于队列不适用于线程?的主要内容,如果未能解决你的问题,请参考以下文章
安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)
ThreadPoolTask Scheduler不适用于线程池
cellForRowAtIndexPath:setNeedsDisplay 不适用于在后台下载的图像,即使在主线程上调用它也是如此