gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:30:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com