1、同步阻塞与异步非阻塞
(1)同步阻塞
客户端提交event至服务器,服务器接收到客户请求后开辟线程处理客户请求,经过复杂的业务计算后将结果返回给客户端。
(2)异步非阻塞
客户端提交Event后会得到一个相应的工单号并且立即返回,Event则会被放置在Event队列中。服务器有若干个工作线程,不断从Event队列中获取任务并且进行异步处理,最后将处理结果保存在另外一个结果集中,如果客户端想要获得结果处理,则可凭借工单号再次获取。
2、线程间的通信
(1)wait与notify
wait和notify方法并不是Thread特有的方法,而是Object中的方法。
wait方法
- wait方法的作用是导致当前进程进入阻塞,有三个重载函数。
public final void wait() throws InterruptedException
public final void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException - 使用wait方法必须拥有该对象的monitor,也就是wait方法必须在同步方法中使用。当前线程执行了wait方法后,会释放该对象monitor的所有权,其他线程才有机会争抢该monitor的所有权。
- 当其他线程调用了Object的notify或者notifyAll方法才能唤醒,或者阻塞时间到达了timeout时间自动唤醒。
- 线程执行了某个对象的wait方法以后,会加入与之对应wait set中,使用notify方法就相当于线程从wait set中弹出。
notify方法
- notify方法的作用是唤醒单个正在执行该对象wait方法的线程。
public final native void notify()
- notify方法也必须在同步方法中使用。被唤醒的线程需要重新获取该对象的monitor才能继续执行。
(2)wait与sleep
相同点
- wait和sleep方法都可以使线程进入阻塞状态。
- wait和sleep方法都可中断方法,被中断后会收到中断异常
不同点
- wait是Object方法,而sleep是Thread特有的方法
- 线程在同步方法中执行wait时会释放monitor,而sleep不会
- wait方法的执行必须在同步方法中执行,而sleep则不需要
(3)notifyAll
notifyAll的作用于notiy类似,用于唤醒由于调用了wait方法而阻塞的线程,但是notify方法只能唤醒其中的一个线程,而notifyALL方法则可以同时唤醒全部的阻塞线程。