Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基于时间的线程锁定_Java_Multithreading - Fatal编程技术网

Java:基于时间的线程锁定

Java:基于时间的线程锁定,java,multithreading,Java,Multithreading,我正在寻找java中的一种方法,通过这种方法,我们可以实现java线程的基于时间的锁定,也可以是基于时间的中断。 考虑这个问题。 java线程调用以下函数 private DATA getData() { DATA data; synchronized(dataLock) { data = fetchData() } return data } 现在假设对fetchData()的调用已挂起,不会返回。 是否有办法在此锁(数据锁)上超时或中断此线程?使用更灵

我正在寻找java中的一种方法,通过这种方法,我们可以实现java线程的基于时间的锁定,也可以是基于时间的中断。 考虑这个问题。

java线程调用以下函数

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,谢谢你的想法,我可以在这方面做一些工作。不,在我所知道的任何编程语言中都没有内置的事务功能。如果一个线程被卡住,则需要另一个线程来尝试中断它。强调尝试。无法保证可以使失控线程超时。