Java多线程编写和阅读

时间:2015-02-10 19:22:53

标签: java multithreading

我想知道我对下面的代码示例是正确的。 我在java中有两个Threads。 Thread_W and Thread_R 两者都可以访问 Queue<String> queue

Thread_W中的

有一个名为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。我真的需要一个缓冲区

2 个答案:

答案 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的线程安全实现,例如LinkedBlockingDequeLinkedBlockingDeque可以是无界的,如果队列为空,take()将阻塞调用线程。如果您使用java.util.concurent包中的类,则无需担心同步。