Java:基于时间的线程锁定
我正在寻找java中的一种方法,通过这种方法,我们可以实现java线程的基于时间的锁定,也可以是基于时间的中断。 考虑这个问题。 java线程调用以下函数Java:基于时间的线程锁定,java,multithreading,Java,Multithreading,我正在寻找java中的一种方法,通过这种方法,我们可以实现java线程的基于时间的锁定,也可以是基于时间的中断。 考虑这个问题。 java线程调用以下函数 private DATA getData() { DATA data; synchronized(dataLock) { data = fetchData() } return data } 现在假设对fetchData()的调用已挂起,不会返回。 是否有办法在此锁(数据锁)上超时或中断此线程?使用更灵
private DATA getData() {
DATA data;
synchronized(dataLock) {
data = fetchData()
}
return data
}
现在假设对fetchData()的调用已挂起,不会返回。
是否有办法在此锁(数据锁)上超时或中断此线程?使用更灵活的接口(例如,
ReentrantLock
),它允许您调用tryLock(长时间,时间单位)
,以防止永远等待。使用更灵活的接口(例如,ReentrantLock
),它允许您调用tryLock(long time,TimeUnit)
,以防止永远等待。我不明白锁的可能重复。如果方法fetchData()
不相关(不知何故)超时1线程应用程序将挂起。如果它确实超时,则多线程应用程序将在从fetchData()
返回时(或当它抛出超时异常时)释放dataLock
。这里的问题是“调用fetchData()
是否存在超时受限的方式?”答案是“不知道”。什么是fetchData()'一旦卡住,将永远不会返回/超时。在这里,我试图找到'同步(数据锁)'调用的“基于时间的锁定”替代方案。与Persxty所说的一样:真正的问题是如何“取消”一个fetchData()
调用。这个问题与线程或锁无关,你只能通过查看fetchData来回答它()
implementation。如果没有办法“解开”它,那么也许您可以更改您的体系结构,以便在从属进程中调用fetchData()
,您可以在需要时终止并重新启动它。(在那里!完成了!)@jameslarge。找到一种“解开”fetchData()的方法
并且锁不是问题。找不到“解除锁定”的方法,因此锁是不相关的。fetchData()
使用的是什么库或源代码?fetchData()
可以发布方法代码吗?我不明白为什么锁可能重复。如果方法fetchData()
不相关(不知为什么)超时1线程应用程序将挂起。如果它确实超时,则多线程应用程序将在从fetchData()
返回时(或当它抛出超时异常时)释放dataLock
。这里的问题是“调用fetchData()
是否存在超时受限的方式?”答案是“不知道”。fetchData()。库必须提供一些超时功能,甚至异步“取消”方法,或者(在Java中)如果“fetchData()”使用可中断通道(或类似通道)。@Persixty,方法“getData()”应由多个线程调用,假设“fetchData()”一旦卡住,将永远不会返回/超时。在这里,我试图找到一个“基于时间的锁定”替代“synchronized(dataLock)”调用。这个问题与线程或锁无关,您只能通过查看fetchData()
实现来回答这个问题。如果无法“解开”它,那么您可以更改您的体系结构,以便在从属进程中调用fetchData()。(去过那里!做到了!)杰姆斯·拉格说得没错。找到一种方法来“取消单击”fetchData()
,锁就不会有问题了。无法找到“取消单击”fectData()
的方法,锁与此无关。fetchData()
使用的是什么库或源?你能发布方法代码吗?谢谢@Kayaman的评论,但要求不同。这与其他线程的计时无关,而与此线程的计时有关。这取决于fetchData()
方法本身。当然,您可以中断线程,并希望这足以阻止它执行任何操作。您可以对锁实现进行子类化,以提供对当前持有锁的线程
的访问(它是ReentrantLock
中的受保护方法)。@CuriousGeorge我认为上面的答案足以超时当前线程。请澄清“这不是对其他线程计时,而是对这个线程计时”@Kayaman,谢谢你的想法,我可以在这方面做一些工作。不,在我所知道的任何编程语言中都没有内置的事务功能。如果一个线程被卡住,则需要另一个线程来尝试中断它。强调尝试。无法保证您可以超时失控线程。感谢@Kayaman的评论,但要求不同。这与其他线程的计时无关,而与此线程的计时有关。这取决于fetchData()
方法本身。当然,您可以中断线程,并希望这足以阻止它执行任何操作。您可以对锁实现进行子类化,以提供对当前持有锁的线程
的访问(它是ReentrantLock
中的受保护方法)。@CuriousGeorge我认为上面的答案足以超时当前线程。请澄清“这不是对其他线程计时,而是对这个线程计时”@Kayaman,谢谢你的想法,我可以在这方面做一些工作。不,在我所知道的任何编程语言中都没有内置的事务功能。如果一个线程被卡住,则需要另一个线程来尝试中断它。强调尝试。无法保证可以使失控线程超时。