线程中的同步与异步,阻塞和非阻塞

时间:2021-07-30 08:26:20
线程中的同步是不是说程序开了多个线程例如UI开了一个线程,等待线程的值返回,但是现在操作UI,UI还是可以工作的?而UI开了一个线程使用阻塞那么现在UI就是无法进行操作了是不是?
UI和其他别的进程或者线程有什么区别?

14 个解决方案

#1


老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。
 
 
所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
 
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
 
程序员写程序,很多情况下,老张和水壶都要涉及,即调用者与被调用者。四种组合模式各有所长。
这个例子和银行排队有异曲同工之妙,可是我觉得这个会比较容易理解一些。
老张一次比一次聪明,我承认跟老张很像。刚开始的情况逻辑比较简单,但效率低下。随着慢慢的提高,效率也提高了。所以个人认为,程序的效率和简单程度是成反比的。
但不是说异步非阻塞就一定是最好的,有的情况下更适合使用同步或者阻塞。

以上来自我都不知道什么时候都收藏的笔记

#2


线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考  http://www.cnblogs.com/xiaozhi_5638/archive/2012/12/01/2797545.html

#3


引用 2 楼 xiaozhi_5638 的回复:
线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozhi_5638/archive/2012/12/0……
同步和异步例如我在UI上有两个button(无限循环),按了其中一个,进入一个线程的时候。我还是可以按另一个线程的是不?
而阻塞和不阻塞才是导致我能不能按的原因是不?

#4


引用 1 楼 nice_fish 的回复:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老……
异步阻塞和同步阻塞有区别吗?两个都是发生阻塞就要等阻塞结束才会有返回是不。

#5


我主要是看了一个人用异步阻塞,感觉产生的效果和同步阻塞没区别,感觉很奇怪,这块也不是很顺所以就迷茫了

#6


引用 3 楼 wumin940590725 的回复:
引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozh……

是的  方法中有类似无限循环这样的耗时操作   就说明它属于阻塞方法  阻塞方法会阻塞调用线程  所以线程以后的代码就不能执行
thread1 :
int a=0;
a = 耗时操作(); //10秒钟返回
Show(a); //不能马上执行

以上thread1会因为耗时操作 而阻塞  如果你另开辟线程thread2去执行耗时操作  thread1就不会阻塞


当两个线程需要使用统一资源时  可能会考虑有一个先后的顺序(比如只有a线程做完某事 线程b才能去做)  这时候就要用到线程同步  windows是抢占式操作系统  谁前谁后没有原则的(如果你不去处理同步 后果可想而知)

严格来说 阻塞和非阻塞是强调方法(代码块)的  跟线程同步与否没有关系(只不过线程同步一般要用到阻塞这种方式去实现)

#7


引用 3 楼 wumin940590725 的回复:
引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozh……

点击一个按钮后  导致不能点击第二个  的原因:
1.你执行了耗时操作(阻塞方法);
2.导致调用线程(UI线程)不能及时往下执行;
3.调用线程(UI线程)不能及时处理Windows消息;
4.界面卡死。

以上跟线程同步没有关系

#8


引用 6 楼 xiaozhi_5638 的回复:
引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 htt……
线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作
这样的话我加不加阻塞都没有区别是吧

#9


引用 7 楼 xiaozhi_5638 的回复:
引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 htt……
SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
这个是最常用的,如果对方在处理消息的时候我想要继续操作UI界面,是不是同步和异步都可以,但是阻塞了的话就不可以操作了

#10


引用 8 楼 wumin940590725 的回复:
引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当……

你要等B执行完  A才执行  A等待的过程可以说是线程阻塞


引用 9 楼 wumin940590725 的回复:
引用 7 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当……

不要说这个东西 这个是方法的同步调用和异步调用  同步调用就是指调用的方法是阻塞的(编写该方法的人决定的)  异步调用指这个方法是非阻塞的(编写该方法的人决定的)  你这话是从网上找的嘛?  我觉得这个不能跟“线程同步”的最初含义混淆

#11


引用 10 楼 xiaozhi_5638 的回复:
引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  ……
是网上找的,所以越看概念越混乱。这个同步异步调用应该都不会导致线程中途卡住是吧。

#12


引用 11 楼 wumin940590725 的回复:
引用 10 楼 xiaozhi_5638 的回复:引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做……

.net中一般同步方法会以sync开头  会阻塞调用线程   异步方法以async开头 不会阻塞调用线程
自己静下心 多琢磨琢磨吧  

#13


引用 12 楼 xiaozhi_5638 的回复:
引用 11 楼 wumin940590725 的回复:引用 10 楼 xiaozhi_5638 的回复:引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程……
哦,就是自动调用了阻塞啊。。。。难怪概念混乱了。

#14


引用 1 楼 nice_fish 的回复:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老……

比喻的很形象,受教了

#1


老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。
 
 
所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
 
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
 
程序员写程序,很多情况下,老张和水壶都要涉及,即调用者与被调用者。四种组合模式各有所长。
这个例子和银行排队有异曲同工之妙,可是我觉得这个会比较容易理解一些。
老张一次比一次聪明,我承认跟老张很像。刚开始的情况逻辑比较简单,但效率低下。随着慢慢的提高,效率也提高了。所以个人认为,程序的效率和简单程度是成反比的。
但不是说异步非阻塞就一定是最好的,有的情况下更适合使用同步或者阻塞。

以上来自我都不知道什么时候都收藏的笔记

#2


线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考  http://www.cnblogs.com/xiaozhi_5638/archive/2012/12/01/2797545.html

#3


引用 2 楼 xiaozhi_5638 的回复:
线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozhi_5638/archive/2012/12/0……
同步和异步例如我在UI上有两个button(无限循环),按了其中一个,进入一个线程的时候。我还是可以按另一个线程的是不?
而阻塞和不阻塞才是导致我能不能按的原因是不?

#4


引用 1 楼 nice_fish 的回复:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老……
异步阻塞和同步阻塞有区别吗?两个都是发生阻塞就要等阻塞结束才会有返回是不。

#5


我主要是看了一个人用异步阻塞,感觉产生的效果和同步阻塞没区别,感觉很奇怪,这块也不是很顺所以就迷茫了

#6


引用 3 楼 wumin940590725 的回复:
引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozh……

是的  方法中有类似无限循环这样的耗时操作   就说明它属于阻塞方法  阻塞方法会阻塞调用线程  所以线程以后的代码就不能执行
thread1 :
int a=0;
a = 耗时操作(); //10秒钟返回
Show(a); //不能马上执行

以上thread1会因为耗时操作 而阻塞  如果你另开辟线程thread2去执行耗时操作  thread1就不会阻塞


当两个线程需要使用统一资源时  可能会考虑有一个先后的顺序(比如只有a线程做完某事 线程b才能去做)  这时候就要用到线程同步  windows是抢占式操作系统  谁前谁后没有原则的(如果你不去处理同步 后果可想而知)

严格来说 阻塞和非阻塞是强调方法(代码块)的  跟线程同步与否没有关系(只不过线程同步一般要用到阻塞这种方式去实现)

#7


引用 3 楼 wumin940590725 的回复:
引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 http://www.cnblogs.com/xiaozh……

点击一个按钮后  导致不能点击第二个  的原因:
1.你执行了耗时操作(阻塞方法);
2.导致调用线程(UI线程)不能及时往下执行;
3.调用线程(UI线程)不能及时处理Windows消息;
4.界面卡死。

以上跟线程同步没有关系

#8


引用 6 楼 xiaozhi_5638 的回复:
引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 htt……
线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作
这样的话我加不加阻塞都没有区别是吧

#9


引用 7 楼 xiaozhi_5638 的回复:
引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当前线程不能继续执行 仅此而已

参考 htt……
SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
这个是最常用的,如果对方在处理消息的时候我想要继续操作UI界面,是不是同步和异步都可以,但是阻塞了的话就不可以操作了

#10


引用 8 楼 wumin940590725 的回复:
引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当……

你要等B执行完  A才执行  A等待的过程可以说是线程阻塞


引用 9 楼 wumin940590725 的回复:
引用 7 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  说一个方法阻塞  本质上指 该方法不能马上返回  当……

不要说这个东西 这个是方法的同步调用和异步调用  同步调用就是指调用的方法是阻塞的(编写该方法的人决定的)  异步调用指这个方法是非阻塞的(编写该方法的人决定的)  你这话是从网上找的嘛?  我觉得这个不能跟“线程同步”的最初含义混淆

#11


引用 10 楼 xiaozhi_5638 的回复:
引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做  一前一后 而不能随机

阻塞一般指方法  ……
是网上找的,所以越看概念越混乱。这个同步异步调用应该都不会导致线程中途卡住是吧。

#12


引用 11 楼 wumin940590725 的回复:
引用 10 楼 xiaozhi_5638 的回复:引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程之间执行有指定顺序  一个做了什么之后  另一个才能做……

.net中一般同步方法会以sync开头  会阻塞调用线程   异步方法以async开头 不会阻塞调用线程
自己静下心 多琢磨琢磨吧  

#13


引用 12 楼 xiaozhi_5638 的回复:
引用 11 楼 wumin940590725 的回复:引用 10 楼 xiaozhi_5638 的回复:引用 8 楼 wumin940590725 的回复:引用 6 楼 xiaozhi_5638 的回复:引用 3 楼 wumin940590725 的回复:引用 2 楼 xiaozhi_5638 的回复:线程同步与否 跟 阻塞非阻塞没关系

线程同步指两个(或多个)线程……
哦,就是自动调用了阻塞啊。。。。难怪概念混乱了。

#14


引用 1 楼 nice_fish 的回复:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老……

比喻的很形象,受教了