现在项目中有这样一个需求,政府需要对辖区内的企业进行查岗,发送一条查岗指令,企业在十分钟内应答就算在岗,十分钟之外就算脱岗,我是每次发送指令就开一个线程进行倒计时十分钟,十分钟之后进行结算,但是没到十分钟的时候所有企业都应答了,需要中断这个线程,我在开线程的时候已经有了线程Id,看网上说ThreadGroup是可以的,但是已经被废弃了,不推荐使用,不知道有没有其他办法中断某个具体的线程的,求教
我觉得你可以使用一个线程作为守护线程,单独处理所有所有企业在岗情况。线程数如果太多的话,会影响其他线程。
我们先理解一下你的问题:
你发出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也可以