线程的阻塞问题

Thread.join是个捣蛋的功能,事实上所有的阻塞都是捣蛋。
只有特殊的底层功能才需要阻塞,比如socket服务等,其他用户级的阻塞功能都是自找麻烦。
解决办法就是共用一个消息(全局变量),在一个可以接受的频率下去查看消息,事实上windows底层的消息循环机制本身就是一个反复查看,根本不存在什么所谓通知,而是有人负重前行,在底层不断查看消息,你在上层才感觉不到查看过程,还以为消息是自己过来的,根本就是有底层代码检查搬运。
所以,用户应用系统也可以设计一个消息机制,借用底层消息系统也可以,不借用更简单。

举个例子:
写个http服务,服务启动后,线程进入listen阻塞状态,此时保留soket为外部变量,线程本身循环检查退出条件,如果条件满足,socket.stop(),如果外部调用stop()也可以终止。
反而是Thread.Abort()并不能中断其内部的soket阻塞,也就不可能在其异常处理中执行soket.stop()。这是个逻辑错误,上层代码不能控制底层。最好的办法反而是最简单的,把阻塞的那个东西放在外部,直接stop,就会停止阻塞,同时也引发了上层调用的异常,线程于是可以正常退出,而不需要使用Abort。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值