我想知道我对下面的代码示例是正确的。
我在java中有两个Threads。 Thread_W and Thread_R
两者都可以访问 Queue<String> queue
。
有一个名为put的方法。
private void put(String email){
queue.offer(email);
}
在Thread_R中有一个名为get AND的方法,它在Thread_R启动时被调用。
public void get(){
while(true)
{
if(!queue.isEmpty())
{
String to = queue.poll();
//thread will consume some time here ...may be 5-10 seconds.
}
}
}
所以Thread_W中的方法put
将通过Thread_W中的 A 其他方法更有效地调用。可以在while循环中。
如果我在我的Java项目中使用此代码,那么Thread_R会丢失放入队列的任何电子邮件吗?
P.S。我真的需要一个缓冲区
答案 0 :(得分:0)
您应该使用Blocking Queue接口的实现,因为它们是线程安全的。
界面提供方法put()
和take()
,它们会一直阻止,直到它们被执行。这样,如果队列已满,则读取线程不会占用大量CPU周期,写入线程也不会写入
你当前忙碌的等待
while(true)
{
if(!queue.isEmpty())
{
//...
}
}
效率不高。最好使用阻塞方法调用,因此如果队列为空(或已满),则无需检查
如果你的写作线程比put()
等待for space to become available的读取线程快,那么你也不能溢出队列的缓冲区。
请记住,您可以通过事先在其设置中设置capicitiy来手动为队列预留更大的缓冲区,例如: ArrayBlockingQueue(int capacity)
。
答案 1 :(得分:0)
如果您想使用无界并发队列,我建议您查看Deque
的线程安全实现,例如LinkedBlockingDeque
。 LinkedBlockingDeque
可以是无界的,如果队列为空,take()
将阻塞调用线程。如果您使用java.util.concurent
包中的类,则无需担心同步。