我想知道我对下面的代码示例是正确的。我有两个线程在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
复制相似问题