【问题标题】:Java: Time based thread lockingJava:基于时间的线程锁定
【发布时间】: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


【解决方案1】:

使用更灵活的Lock 接口(例如ReentrantLock),它允许您调用tryLock(long time, TimeUnit unit) 以防止永远等待。

【讨论】:

  • 感谢@Kayaman 的评论,但要求不同。它不是关于计时其他线程,而是超时这个线程。
  • 这取决于fetchData() 方法本身。你当然可以中断线程并希望这足以阻止它做它正在做的任何事情。您可以对锁实现进行子类化,以提供对当前持有锁的Thread 的访问(它是ReentrantLock 中的受保护方法)。
  • @CuriousGeorge 我认为上述答案足以使当前线程超时。请明确“不是计时其他线程,而是超时这个线程”
  • @Kayaman,谢谢你的想法,我可以解决这个问题。
  • 不,在我所知道的任何编程语言中都没有这样的内置事务功能。如果一个线程卡住了,就需要另一个线程来尝试中断它。强调尝试。无法保证您可以使失控的线程超时。
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多