我正在创建一个包含10个项目的队列(在BeforeClass中),然后我使用10个线程(使用@Test TestNG注释和线程)来读取队列中的值。我使用while循环来确保我没有尝试从空队列中轮询值。 但是,由于同步问题,while在其他线程轮询值并清除它之前就要求队列状态,因此我得到null而不是从队列中停止轮询。 如何在while循环到队列之间进行同步?
import org.testng.annotations.Test;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
public class LinkedConcurrentQueue {
Queue<String> queue;
@Test
public void testA(){
queue = new ConcurrentLinkedDeque<String> ();
for(int i = 0; i<10; i++ ){
queue.add(String.valueOf(i));
}
}
@Test(enabled = true, threadPoolSize = 10, invocationCount = 10, timeOut = 100000)
public void testB() throws InterruptedException {
while(!queue.isEmpty()) {
Thread.sleep(20);
System.out.println(queue.poll ( ));
}
}
}
这种情况下的输出是:
1
0
3
4
2
8
7
6
5
9
null
null
null
null
null
答案 0 :(得分:2)
您不必同步(因为您正在使用并发队列),但您确实需要更改循环:
while (true) {
String el = queue.poll();
if (el == null)
break; // no more elements
Thread.sleep(20);
System.out.println(el);
}