如何在方法之间同步线程?

时间:2017-11-08 12:02:08

标签: java multithreading thread-safety

我正在创建一个包含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

1 个答案:

答案 0 :(得分:2)

您不必同步(因为您正在使用并发队列),但您确实需要更改循环:

while (true) {
    String el = queue.poll();
    if (el == null)
        break; // no more elements
    Thread.sleep(20);
    System.out.println(el);
}