为了账号安全,请及时绑定邮箱和手机立即绑定

检测java线程开始等待并运行一些代码

检测java线程开始等待并运行一些代码

青春有我 2021-11-24 16:11:10
有没有办法放置任何类型的事件侦听器,当某个线程(例如当前线程)停止其活动并开始等待或终止时将调用该侦听器?我需要这个来通知对象并释放一些资源,当它在这个线程中没有被积极使用但仍然存储在内存中的某个地方以防止它被垃圾收集时 - 否则我会将该资源释放代码放在 finalise( ) 方法。UPD 用例:保持对 jdbc 结果集或数据库连接的引用的对象;当对象暂时搁置或完全丢弃时,应自动调用相应的 close() 或 commit(),而无需程序调用任何类型的清理方法。(毫无疑问,我如何锁定一次只能从一个线程访问的对象,已解决。)
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

明显的非答案:错误的设计点。线程不“拥有”资源。

线程只是“执行线程”。他们运行你告诉他们运行的代码。因此,一个线程不拥有它来的任何对象。

因此,没有内置机制可以帮助满足您的要求。您必须自己实现一些东西,依赖于监控线程及其状态。这将是一项艰巨且具有挑战性的任务。主要是因为:多线程很难。

这里的严肃建议:从这个设计退后一步。而是考虑其他不同的方式来处理此类“资源”。


查看完整回答
反对 回复 2021-11-24
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这确实是一种错误的做法。显然,您可以像这样在 finally 块中锁定对象并解锁它:


private Lock lock = new ReentrantLock();


public void useObject() {

    lock.lock();

    try {

        //do something with your resource.

    }

    finally {

        lock.unlock();

    }

}

这样,如果运行 useObject 的线程终止,它将执行 finally 块,并解锁保护资源的锁。


但是没有办法检测线程没有任何活动。如果线程被操作系统抢占,您将无从得知。那是在抽象层之下,你作为开发者,在操作。


如果您想更多地了解操作系统如何与线程一起工作,以及您不能做什么,您应该查看


Java 多线程、并发和性能优化


Udemy 上的课程。它还讨论了如何正确使用正确的锁来进行这种安全同步,并在您必须共享数据库连接等资源时从应用程序中获得最佳性能。


我希望它有帮助


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信