首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java多线程读写

Java多线程读写
EN

Stack Overflow用户
提问于 2015-02-10 19:22:52
回答 2查看 110关注 0票数 0

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

在Thread_W中有一个名为put的方法。

代码语言:javascript
运行
复制
private void put(String email){
 queue.offer(email);
}

在Thread_R中,有一个名为get的方法,它在Thread_R启动时被调用一次。

代码语言:javascript
运行
复制
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中的方法将更有效地被调用--,Thread_W.may中的其他方法在will循环中。

如果我在我的Java项目中使用这段代码,Thread_R会丢失任何放在队列中的电子邮件吗?

我真的需要一个缓冲

EN

回答 2

Stack Overflow用户

发布于 2015-02-10 19:31:29

您应该使用阻塞队列接口的实现,因为它们是线程安全的。

接口提供了方法put()take(),它们一直阻塞直到它们执行为止。这样,如果队列已满,读取线程就不会消耗大量的CPU周期,而写入线程也不会写入。

你现在忙着等

代码语言:javascript
运行
复制
while(true)
{
   if(!queue.isEmpty())
   {
       //...
   }
}

不是很有效率。最好使用阻塞方法调用,因此不需要检查队列是否为空(或已满)。

此外,如果您的写入线程比读取线程快得多,则不能溢出队列的缓冲区,如put() way的可利用的空间

请记住,您可以通过预先在队列的构造器中设置capicitiy来手动为队列预留更大的缓冲区,例如ArrayBlockingQueue(int capacity)

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 07:20:55

如果您想使用无界并发队列,我建议查看一下Deque的线程安全实现,例如LinkedBlockingDequeLinkedBlockingDeque可以是无界的,如果队列为空,take()将阻塞调用线程。如果使用java.util.concurent包中的类,则不需要担心同步问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28440087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档