同步队列是否在每个offer/put上创建一个线程



我不明白同步队列是如何工作的
我知道这个想法是直接将任务移交给线程,但构造函数不像其他API那样有一个绑定的线程数,例如最大线程数
那么,当一个putoffer完成时,它本质上是传递给另一个线程吗
那么,如果我这样做,例如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

关于同步队列的更多信息