一、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窗体程序,则会陷入假死现象。
非阻塞:任务执行时,主线程继续响应,可以执行其他任务。