这个问题由来已久,翻过很多博客,看到过各种各样的解释。
但我知道你不喜欢看大段的文字,手痒画了几张图,希望能给大家解惑。
同步和异步
稍微解释下。。
我认为,同步和异步的根本区别就是,目标方法是不是在当前线程上执行的。
- 同步:目标方法在当前线程上执行,会占用当前线程的执行时间
- 异步,是把目标方法交给另一个线程去执行。最简单的办法就是new一个Thread去做这个事情了,或者不管什么方式,只要通知到另外一个线程去做某件事,这就是异步了。
阻塞和非阻塞
这和同步异步完全不是一回事,描述的不是一个阶段的东西。这两个词经常用来描述结果获取。
- 阻塞:当前线程调用某个方法想做某件事,但是如果条件暂不满足,可能会导致当前线程进入非Running状态(比如Wait/Sleep/Park),直到发生了另外一件事情(比如超时,或者接到另一个线程的通知,或者获得锁),才能终止这种非运行状态,完成想做的事情,这就是阻塞。
- 非阻塞:当前线程调用某个方法想做某件事,但是如果条件暂不满足,方法会立即退出并”Say NO!”,表示无法完成,这就是非阻塞。有时候,当前线程会持续不断地调用这个方法,直到最终成功。
其他
最近看到一篇博客,讲的是计算机内核的各种I/O复用机制,很不错,推荐给大家:
再谈select, iocp, epoll,kqueue及各种I/O复用机制