我想知道我对下面的代码示例是正确的。我有两个线程在java。Thread_W and Thread_R
都可以访问 Queue<String> queue
。
在Thread_W中有一个名为put的方法。
private void put(String email){
queue.offer(email);
}
在Thread_R中,有一个名为get的方法,它在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中的方法将更有效地被调用--,Thread_W.may中的其他方法在will循环中。
如果我在我的Java项目中使用这段代码,Thread_R会丢失任何放在队列中的电子邮件吗?
我真的需要一个缓冲
发布于 2015-02-10 19:31:29
您应该使用阻塞队列接口的实现,因为它们是线程安全的。
接口提供了方法put()
和take()
,它们一直阻塞直到它们执行为止。这样,如果队列已满,读取线程就不会消耗大量的CPU周期,而写入线程也不会写入。
你现在忙着等
while(true)
{
if(!queue.isEmpty())
{
//...
}
}
不是很有效率。最好使用阻塞方法调用,因此不需要检查队列是否为空(或已满)。
此外,如果您的写入线程比读取线程快得多,则不能溢出队列的缓冲区,如put()
way的可利用的空间。
请记住,您可以通过预先在队列的构造器中设置capicitiy来手动为队列预留更大的缓冲区,例如ArrayBlockingQueue(int capacity)
。
发布于 2015-02-12 07:20:55
如果您想使用无界并发队列,我建议查看一下Deque
的线程安全实现,例如LinkedBlockingDeque
。LinkedBlockingDeque
可以是无界的,如果队列为空,take()
将阻塞调用线程。如果使用java.util.concurent
包中的类,则不需要担心同步问题。
https://stackoverflow.com/questions/28440087
复制相似问题