Thread.join是个捣蛋的功能,事实上所有的阻塞都是捣蛋。
只有特殊的底层功能才需要阻塞,比如socket服务等,其他用户级的阻塞功能都是自找麻烦。
解决办法就是共用一个消息(全局变量),在一个可以接受的频率下去查看消息,事实上windows底层的消息循环机制本身就是一个反复查看,根本不存在什么所谓通知,而是有人负重前行,在底层不断查看消息,你在上层才感觉不到查看过程,还以为消息是自己过来的,根本就是有底层代码检查搬运。
所以,用户应用系统也可以设计一个消息机制,借用底层消息系统也可以,不借用更简单。
举个例子:
写个http服务,服务启动后,线程进入listen阻塞状态,此时保留soket为外部变量,线程本身循环检查退出条件,如果条件满足,socket.stop(),如果外部调用stop()也可以终止。
反而是Thread.Abort()并不能中断其内部的soket阻塞,也就不可能在其异常处理中执行soket.stop()。这是个逻辑错误,上层代码不能控制底层。最好的办法反而是最简单的,把阻塞的那个东西放在外部,直接stop,就会停止阻塞,同时也引发了上层调用的异常,线程于是可以正常退出,而不需要使用Abort。
最后
以上就是耍酷大山最近收集整理的关于线程的阻塞问题的全部内容,更多相关线程内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复