线程池为什么要用阻塞队列呢?使用一般的队列也能完整任务啊?
阻塞队列主要是用于生产者-消费者模型的情况。
比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。
如果使用非阻塞队列,它不会对当前线程产生阻塞,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。
简单的一个场景,消费者一端不一定是时时提交任务就能马上执行,可能有很多因素,比如计算或者IO等资源没办法马上就位,所以有等待,但是任务队列也不一定就无限大,所以才有了阻塞队列,在任务池已满且队列已经有很多任务时,需要阻塞等待
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。