<强> java同步,异步,阻塞和非阻塞分析强>
<强>概要:强>
正常情况下,我们的程序以同步非阻塞的方式在运行。但是我们的程序总会出现一些耗时操作,比如复杂的计算(找出1到10个亿之间的素数)和程序本身无法控制的操作(IO操作,网络请求)。包含这些耗时操作的方法我们可以把它称为阻塞方法,包含这些耗时操作的任务我们可以把它称为阻塞任务。阻塞与非阻塞是以是否耗时来定义的。
如果程序中存在大量阻塞操作,就会影响程序性能。但是阻塞的存在是客观事实,我们的程序是无法改变它的,一个网络请求需要3秒才能响应,我们不可能让它1毫秒就能响应,因为接受请求的服务器可能完全不由我们控制。但是我们可以改变处理阻塞的方式,以异步的方式处理阻塞任务。实现异步的主要技术就是多线程。图示:
同步和异步是个时序概念。同步就是同时只执行一个任务,而异步则是同时执行多个任务。
<强>代码示例强>
<强>模拟网络请求:强>
包com.zzj.asyn; 公开课HttpRequest { 私人可调用的调用; 公共HttpRequest(可调用的调用){ 这一点。可调用=可调用的; } 公共空间发送(){//模拟网络请求 尝试{ 线程。睡眠(1000 * 5); }捕捉(InterruptedException e) { e.printStackTrace (); .interrupt Thread.currentThread () (); }//回调 this.callable。调用(“Hello world !”); } 公共接口调用{ 无效电话(字符串的结果); } } >之前以同步方式处理阻塞任务:
包com.zzj.asyn; 进口com.zzj.asyn.HttpRequest.Callable;/* * *以同步的方式处理阻塞任务 * @author联想 * */公共类应用{ 公共静态void main (String [] args) { 新HttpRequest(新调用(){ @Override 公共空间调用(字符串结果){ system . out。println(“线程:“+ Thread.currentThread () . getname ()); system . out。println(“从远程服务器消息:”+结果); } }).send (); system . out。println(“线程”+ Thread.currentThread () . getname() +“结束了!”); } } >之前结果:
线程:主要 从远程服务器消息:Hello world ! 线程主要是结束了! >之前以异步的方式处理阻塞任务:
包com.zzj.asyn; 进口com.zzj.asyn.HttpRequest.Callable;/* * *以异步的方式处理阻塞任务 * @author联想 * */公开课App2 { 公共静态void main (String [] args) { 新线程(新Runnable () { @Override 公共空间run () { 新HttpRequest(新调用(){ @Override 公共空间调用(字符串结果){ system . out。println(“线程:“+ Thread.currentThread () . getname ()); system . out。println(“从远程服务器消息:”+结果); } }).send (); } }).start (); system . out。println(“线程”+ Thread.currentThread () . getname() +“结束了!”); } } >之前结果:
线程主要是结束了! 线程:Thread-0 从远程服务器消息:Hello world ! >之前,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
java同步,异步,阻塞和非阻塞分析