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

标签 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

最佳答案

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

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

关于java - 如何在方法之间同步线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47179235/

相关文章:

java - 连接并行流

java - 使用多线程更新GUI

multithreading - 访问TObjectList线程的不同索引是否安全?

java - 如何将值 ""hello""分配给字符串?

java - Android - 如何开始新 Activity

java - 如何将 ArrayList/Set 转换为 JSON 并使用 postforobject 方法发布数据?

c# - 由 ThreadPool 中的线程填充的 ObservableCollection

java - 为什么我的java同步方法会发生这个错误?

c# - BackgroundWorker.CancellationPending 线程安全如何?

java - 简单的 Groovy 线程管理器