开发者社区> 问答> 正文

Java 如何让一个线程运行特定的时间终止?

有一个对象列表,按对象的过期时间戳升序排序,当内存快要不足时,想触发一个线程从头遍历列表,把列表前面过期的对象都释放掉(对象的资源是被pool的,必须手动release)
列表不是线程安全的(因为程序其他部分逻辑的原因,这里使用线程安全的集合类并不能解决问题),工作线程和释放资源的线程同时只能有一个操作对象列表
我的想法是,如果释放资源的线程在列表上操作太长时间,工作线程一直被阻塞,很长时间整个系统就不能提供服务了,所以我想限制每次释放资源的线程的执行时间,在给定的时间里能释放多少对象就释放多少(并且时间结束时,是优雅的结束释放工作),然后工作线程继续执行
请问如何实现我这个思路?如果同时只有一个线程访问对象列表,是不是把释放对象的工作放在工作线程中更好?怎么实现执行特定的时间呢?希望能有更标准的思路

展开
收起
蛮大人123 2016-02-27 19:35:51 3405 0
2 条回答
写回答
取消 提交回答
  • 2个问题,不能因为解决一个问题,带来另外的问题
    1.对象过期时间,可以参照memcached redis guavaCache等的实现机制
    2.一个对象列表,多个线程访问,还是排他访问,这个就要看下锁的粒度是否合理了

    2019-07-17 18:49:18
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    工作线程和释放资源的线程同时只能有一个操作对象列表这个前提决定了你必须使用synchronized块对操作这个列表的逻辑做保护,这个没得说;剩下的问题就是:如何让回收线程操作列表的时间更短?
    我的思路是这样的:很简单,你的回收线程在操作列表时,只做一件事情:把该回收的对象移出列表,放到另一个地方去(比如另一个列表,"列表2")仅仅是“移出”的话,这个操作是非常快的,不知道你这个列表有多大,一般情况都能瞬间完成;然后让工作线程去操作列表,回收线程慢慢来处理"列表2"中的回收工作, 互不干扰;如果你的对象列表确实很极端地大,那么你可以将回收线程设计成"主-次"线程2层结构,其中主线程开启子线程对列表做移出操作,并持有子线程对象的应用; 而子线程,实现了interrupt方法,在方法中抛出一个你自定义的exception;主线程在启动子线程后,sleep(你认为合适的时间),醒来时若发现子线程还未结束,就调用子线程的interrupt方法

    2019-07-17 18:49:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载