SynchronousQueue是无缓冲区的阻塞队列,即不能直接向队列中添加数据,会报队列满异常,如下所示:
import java.util.concurrent.SynchronousQueue;
public class SynchronousQueueExp {
public static void main(String[] args) {
SynchronousQueue<String> sq=new SynchronousQueue<>();
String str="aaa";
sq.add(str);
}
}

必须在有消费者阻塞等待时生产者才可以向队列中添加数据,这时由阻塞状态的消费者直接获取,相当于没有向队列中添加数据,直接将数据交给了消费者。
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
public class SynchronousQueueExp {
public static void main(String[] args) {
final SynchronousQueue<String> sq=new SynchronousQueue<>();
/*String str="aaa";
sq.add(str);*/
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
System.out.println("消费者阻塞等待获取数据...");
System.out.println("消费者消费数据:"+sq.take());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t1");
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
sq.add("bb");
}
},"t2");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}

本文介绍了SynchronousQueue这一特殊类型的阻塞队列,它不存储元素,而是在生产者线程试图添加元素时直接传递给消费者线程。文章通过示例展示了如何使用SynchronousQueue,并解释了其工作原理。
1万+

被折叠的 条评论
为什么被折叠?



