【发布时间】:2017-09-18 11:18:27
【问题描述】:
我正在寻找一种java方法,通过它我们可以实现java线程的基于时间的锁定,或者可能是基于时间的中断。 考虑一下。
一个java线程调用下面的函数,
private DATA getData() {
DATA data;
synchronized(dataLock) {
data = fetchData()
}
return data
}
现在假设对 fetchData() 的调用已挂起,不会返回。 有没有办法让这个锁(dataLock)在这里超时,或者中断这个线程?
【问题讨论】:
-
我不明白为什么锁是相关的。如果
fetchData()方法没有(以某种方式)超时,则 1 线程应用程序将挂起。如果它确实超时,那么多线程应用程序将从fetchData()返回(或当它引发超时异常时)释放dataLock。这里的问题实际上是“是否存在调用fetchData()的超时受限方式),答案是'不知道'。fetchData()做什么。必须库提供一些超时功能甚至异步' cancel' 方法或(在 Java 中)如果 'fetchData()` 正在使用可中断通道(或类似的通道)。 -
@Persixty,方法 'getData()' 应由多个线程调用,假设 'fetchData()' 一旦卡住,将永远不会返回/超时。在这里,我试图找到“同步(dataLock)”调用的“基于时间的锁定”替代方案。
-
同上 Persixty 所说的:真正的问题是如何“解除”
fetchData()调用。这个问题与线程或锁无关,只能通过查看fetchData()实现来回答。如果没有办法“解开”它,那么也许您可以更改您的架构,以便在从属进程中调用fetchData(),您可以在需要时终止并重新启动。 (去过那里!做到了!) -
@jameslarge 没错。想办法“解开”
fetchData()并且锁不是问题。无法找到“解开”fectData()的方法,并且锁定无关紧要。fetchData()使用什么库或源?能贴出方法代码吗?
标签: java multithreading