有什么方法可以放置某种事件侦听器,该侦听器将在某个线程(例如当前线程)停止活动并开始等待或终止时被调用吗?
当此对象未在该线程中处于活动状态但仍存储在内存中以防止其被垃圾回收时,我需要此对象来通知并释放一些资源-否则,我将放置该资源释放代码在finalise()方法中。
UPD 用例:保留对jdbc结果集或数据库连接的引用的对象;当暂时搁置对象或将其完全丢弃而不需要程序调用任何清理方法时,应分别自动调用相应的close()或commit()。 (毫无疑问,我如何锁定一次只能从一个线程访问的对象,解决了。)
答案 0 :(得分:2)
独特的非答案:错误的设计点。 线程不“拥有”资源。
线程只是“执行线程”。他们运行您告诉他们运行的代码。因此,线程不拥有它所来自的任何对象。
因此,没有内置的机制可以满足您的需求。您将不得不依靠监视线程及其状态来自己实现一些东西。这将是一项艰巨而富有挑战性的任务。主要是因为:多线程很难。
这里的建议很认真:从此设计退后一步。而是考虑使用其他不同的方式来处理此类“资源”。
答案 1 :(得分:1)
这确实是错误的方法。 显然,您可以锁定对象并在finally块中将其解锁,如下所示:
siteid_items = json_['displayValue']['siteId'].items()
rows = json_["rows"]
result = list(
list(item) + row
for item, row in zip(siteid_items, rows)
)
print(result)
'''
stdout:
[['334507', 'XXX', '334507', 36.07, 3985499.0],
['271018', 'YYY', '271018', 23.11, 1335150.0]]
'''
这样,如果运行useObject的线程终止,它将执行finally块,并解锁保护资源的锁。
但是无法检测到线程没有任何活动。如果该线程被操作系统抢占,则您无法了解它。作为开发人员,您要低于抽象级别。
如果您想进一步了解操作系统如何与线程一起使用,而您不能做的事情,请查看
Java多线程,并发和性能优化
关于乌迪米的课程。 它还讨论了如何正确使用正确的锁来进行这种安全的同步,并在必须共享数据库连接等资源时从应用程序中获得最佳性能。
我希望对您有帮助