我不明白同步队列是如何工作的
我知道这个想法是直接将任务移交给线程,但构造函数不像其他API那样有一个绑定的线程数,例如最大线程数
那么,当一个put
或offer
完成时,它本质上是传递给另一个线程吗
那么,如果我这样做,例如100个put
,它将被传递到100个线程
我试着阅读源代码,但不知道会发生什么。它似乎创建了一个节点的链接列表,每个节点都封装了一个线程,但我不清楚如何维护这个列表,例如扩展/收缩等,以及线程如何运行任务。
那么,当我们提供任务时,这个列表会扩展吗?因此,消费者线程(服务员)不断增加
这些有重复使用的吗?或者只是执行一些事情然后停止?
听起来你误解了SynchronousQueue
的目的。
SynchronousQueue
不创建任何线程。调用put
时,直到另一个线程(您创建的线程)从SynchronousQueue
中取出该元素,put
才会结束。
"如果我这样做,例如100个put
"如果你有100个线程,每个线程都在同一个SynchronousQueue
上调用put
,那么所有这些线程都将等待,直到其他线程开始take
这些元素离开。如果有一个线程,它一次只执行一个put
,每次都会等待另一个线程执行该元素,然后再添加另一个。
内部使用的列表是一个链表,它像链表通常做的那样扩展并获得GC。
我知道这个想法是将任务移交给线程直接,但构造函数没有绑定,例如与其他API类似的线程。
队列实现的构造函数中所有int参数的第一个是SIZE
,而不是线程数。
那么,当我们提供任务时,这个列表会扩展吗?因此消费者线索(服务员)不断增加?
同步队列用于切换。来自生产者的put()
调用将被阻塞,直到队列中有一个消费者执行take()
为止。这与线程数无关。消费者线程不一定要增加。一旦消费者完成了对一条消息的处理,它就可以再次从队列中执行take()操作。
public class MyWorker extends Thread {
private final BlockingQueue<String> queue;
public MyWorker(BlockingQueue<String> queue) {
this.queue = queue;
}
public void run() {
try {
while ( true ) {
String s = queue.take();
doWork(s);
}
}
catch ( InterruptedException ie ) {
// just terminate
}
}
}
public class SyncQueueExample {
// …
public SyncQueueExample() {
try {
int workItem = 0;
// Create a synchronous queue
BlockingQueue<String> queue = new SynchronousQueue<String>();
// Create the child worker thread
MyWorker worker = new MyWorker(queue);
worker.start();
// Start sending to the queue
while ( true ) {
System.out.println("nPlacing work on queue");
String work = "Work Item:" + (++workItem);
queue.put(work);
}
}
catch ( Exception e ) {
e.printStackTrace();
}
}
}
输出:运行时,队列生产者和消费者之间的输出将"协调",实际上,并交替如下:
Placing work on queue
Thread 'Thread-1' processing work: Work Item:1
Placing work on queue
Thread 'Thread-1' processing work: Work Item:2
Placing work on queue
Thread 'Thread-1' processing work: Work Item:3
Placing work on queue
Thread 'Thread-1' processing work: Work Item:4
关于同步队列的更多信息