SynchronousQueue
时间: 2024-05-17 11:14:09 浏览: 73
SynchronousQueue是Java中的一个阻塞队列,它具有以下特点:
1. SynchronousQueue是一个没有任何内部容量的阻塞队列。
2. 每个插入操作必须等待另一个线程的对应移除操作,否则插入操作会一直阻塞。
3. 每个移除操作必须等待另一个线程的对应插入操作,否则移除操作会一直阻塞。
4. SynchronousQueue主要用于线程之间的直接传输,例如一个线程生产数据,另一个线程消费数据,它们之间通过SynchronousQueue进行数据交换。
需要注意的是,由于SynchronousQueue没有任何内部容量,因此对于没有空闲线程处理插入或移除操作的情况,SynchronousQueue可能会导致一些线程永久阻塞。因此,在使用SynchronousQueue时需要特别小心。
相关问题
synchronousqueue
SynchronousQueue是Java中的一个阻塞队列,它具有以下特点:
1. SynchronousQueue是一个没有任何内部容量的阻塞队列。
2. 每个插入操作必须等待另一个线程的对应移除操作,否则插入操作会一直阻塞。
3. 每个移除操作必须等待另一个线程的对应插入操作,否则移除操作会一直阻塞。
4. SynchronousQueue主要用于线程之间的直接传输,例如一个线程生产数据,另一个线程消费数据,它们之间通过SynchronousQueue进行数据交换。
需要注意的是,由于SynchronousQueue没有任何内部容量,因此对于没有空闲线程处理插入或移除操作的情况,SynchronousQueue可能会导致一些线程永久阻塞。因此,在使用SynchronousQueue时需要特别小心。
线程池 SynchronousQueue
SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反之亦然。SynchronousQueue非常适合于传递性场景,即一个线程生产的东西必须直接被另一个线程消费,没有中间过程。在线程池中,SynchronousQueue作为工作队列,可以将任务直接提交给线程池中的工作线程,而不需要将任务缓存到队列中等待工作线程的处理。这样可以避免任务在队列中等待的时间,从而减少了整个任务的响应时间。
下面是一个使用SynchronousQueue的小Demo:
```
public class TestSynchronousQueue {
public static void main(String[] args) throws Exception {
//使用非公平策略
// SynchronousQueue synchronousQueue= new SynchronousQueue();
//使用公平策略
SynchronousQueue synchronousQueue= new SynchronousQueue(true);
new Thread(() -> {
try {
synchronousQueue.put("A");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
//休眠一下,让异步线程完成
Thread.sleep(1000);
new Thread(() -> {
try {
synchronousQueue.put("B");
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}).start();
//休眠一下,让异步线程完成
Thread.sleep(1000);
new Thread(() -> {
try {
Object take = synchronousQueue.take();
System.out.println(take);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}).start();
//休眠一下,让异步线程完成
Thread.sleep(1000);
//不管如何输出,都是 0
System.out.println(synchronousQueue.size());
}
}
```
阅读全文