返回首页

java 阻塞队列和非阻塞队列的区别 知乎

来源:www.muyeseed.com   时间:2023-01-24 07:48   点击:205  编辑:admin   手机版

一、java 阻塞队列和非阻塞队列的区别 知乎

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.

从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。一下是阻塞队列的实现:

public class B<a href=target=_blank class=baidu-highlight>lock</a>ingQueue {

 

private List queue = new LinkedList();

 

private int  limit = 10;

 

public B<a href= target=_blank class=baidu-highlight>lock</a>ingQueue(int limit){

 

this.limit = limit;

 

}

 

public synchronized void enqueue(Object item)

 

throws InterruptedException  {

 

while(this.queue.size() == this.limit) {

 

wait();

 

}

 

if(this.queue.size() == 0) {

 

notifyAll();

 

}

 

this.queue.add(item);

 

}

 

public synchronized Object dequeue()

 

throws InterruptedException{

 

while(this.queue.size() == 0){

 

wait();

 

}

 

if(this.queue.size() == this.limit){

 

notifyAll();

 

}

 

return this.queue.remove(0);

 

}

 

}

二、阻塞i/o和非阻塞i/o的异同点

阻塞模式是指某个输入流在执行到某步骤时,需要外界或者其他外部数据的输入后该流才能继续往下执行,在未得到外部数据之前,该流是静止不动的,这就是阻塞模式。ps:按照我自己的理解 比如,一个小程序要求实现用户输入一个字符串后再将该字符串

三、阻塞和非阻塞系统调用的区别是什么?请举一个使用非阻塞系统调用的例子

比如你读取一个文件,如果采用非阻塞模式,那么不等你读取的文件返回,就执行下一行代码;

阻塞的话,就等你读取完,再执行下一行代码

四、请问能不能简单的道出同步/异步的区别,以及阻塞/非阻塞的区别,最好举一个例子来说明,谢谢!

同步:任务执行时,主线程需等待任务的结束,才能继续向下执行。

异步:通常将任务分派到.NET线程池中执行,主线程不需等待任务的结束,依然可以执行其他任务。

阻塞:任务执行时,主线程无法继续响应,不能执行其他任务。如果是Windows窗体程序,则会陷入假死现象。

非阻塞:任务执行时,主线程继续响应,可以执行其他任务。

顶一下
(0)
0%
踩一下
(0)
0%