java - 同步队列是否在每个报价/放置上创建一个线程?

标签 java multithreading concurrency queue java.util.concurrent

我无法理解 Synchronous Queue有效。
我知道这个想法是任务直接移交给线程,但构造函数没有限制,例如像其他 API 一样的最大线程数。
所以当 putoffer 完成时,它实际上是否传递给另一个线程?
所以如果我这样做100个put会传给100个线程吗?
我试图阅读源代码,但无法弄清楚会发生什么。它似乎创建了一个节点链表,其中每个节点都封装了一个线程,但是这个列表是如何维护的,例如展开/收缩等以及胎面如何运行任务对我来说并不清楚。
那么这个列表会随着我们提供任务而扩展吗?结果消费者线程(服务员)不断增加?
这些中有任何被重复使用的吗?或者只是执行某事然后停止?

最佳答案

听起来你误解了 SynchronousQueue 的目的.

SynchronousQueue不创建任何线程。 当您调用 put , put直到另一个线程(您创建的线程)将该元素从 SynchronousQueue 中取出后才会完成.

“如果我这样做,例如 100 put” 如果您有一百个线程,每个线程都调用 put同样SynchronousQueue ,然后所有这些线程将等待直到其他线程开始 take那些元素走了。如果你有一个线程,它只会做一个 put一次,每次它都会等待另一个线程在添加另一个之前获取该元素。

内部使用的列表是一个链表,它像通常的链表一样扩展并获得 GC。

关于java - 同步队列是否在每个报价/放置上创建一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475301/

相关文章:

java - 从特定行数获取数据

java - 使用 jOOq 时如何将参数值用括号括起来?

python - 发生异常 : TypeError start() takes 1 positional argument but 2 were given in multithreading python

c++ - 如何从C++获取linux 2.6中的SPID

Java 执行器 : Submitting a batch of tasks?

java - 对比有什么区别?

java - 为什么我无法在接口(interface)中创建默认方法?

java - 如何分析线程生命周期性能

java - 当线程更改状态时,有什么方法可以在进程中获取通知吗?

events - 在 Go 中监听事件的惯用方法是什么?