如何根据线程Id中断某个具体的线程,或者根据线程Id获取到线程对象 5C

现在项目中有这样一个需求,政府需要对辖区内的企业进行查岗,发送一条查岗指令,企业在十分钟内应答就算在岗,十分钟之外就算脱岗,我是每次发送指令就开一个线程进行倒计时十分钟,十分钟之后进行结算,但是没到十分钟的时候所有企业都应答了,需要中断这个线程,我在开线程的时候已经有了线程Id,看网上说ThreadGroup是可以的,但是已经被废弃了,不推荐使用,不知道有没有其他办法中断某个具体的线程的,求教

3个回答

我觉得你可以使用一个线程作为守护线程,单独处理所有所有企业在岗情况。线程数如果太多的话,会影响其他线程。

ainiburuqusi
ainiburuqusi 回复qq_33355821: 客户存在不确定性,未知性,最好的方案的做成守护进程,后期如果有需要可以配合redis使用,redis字符串Key可以设置失效时间,跟你的需求也可以吻合。
大约 2 年之前 回复
weixin_37893887
玄尺 回复qq_33355821: 如果按照这个思路设计,辖区内如果存在100000个企业是不是需要开启100000个线程,这个思路有问题
大约 2 年之前 回复
qq_33355821
泼墨画丹青 但我可能同时有十家企业在查岗,那我肯定要开十个线程啊
大约 2 年之前 回复

我们先理解一下你的问题:
你发出n个请求给n企业,企业收到请求之后会立刻响应,如果10分钟响应就是超时,你需要记录这个状态,如果不超时就没事。
你当前的做法:
发出一个请求就开启一个线程,10这个线程直接wait十分钟,起来之后看一下是不是得到响应了,如果没有得到响应你就处理这个事件。问题是当前请求已经正常处理,但是这个定时器还在,你想当响应过来的时候中断这个定时器。
我的想法:
1、当前的设计不合理,主要是资源浪费,没有好好的设计。
2、发出请求之后将数据记录到数据库中(bizId, requestTime, responseTime, enable),当企业响应到来,更新数据库responseTime字段。这样就不需要定时任务了,只需要查询数据库将reponseTime - requestTime > 10分钟 and enable = 1的数据捞出来就是你想要的事件了。

中断线程方式:
1、首先线程与线程值独立的,不存在中断这个说法,使用线程间通信更为合理
2、如果涉及思路不变,可以使用sleep(10分钟),然后主线程只需要Interrupted一下,这时候jvm会帮组我们给这个线程发一个中断标记,sleep会订阅这个事件,然后抛出一个中断异常,你可以catch住这个异常,然后线程退出
3、使用wait/notify,线程起来之后先object.wait(10分钟),然后只需要object.notify()就可以从wait上起来
4、使用lock也可以

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐