Java中等效的Ada Select语句

3

有人知道是否可以在Java中为线程编写Ada风格的选择语句,或者是否有等效的方法可以实现吗?

具体而言,我想使用结构体:

select
  javaThread.someEntry();
else
  //do something else if call not accepted straight away
end select

或者

select
  javaThread.someEntry();
or
  //delay before entry call expires
end select

假设someEntry()是一个同步方法,由于许多其他线程也想要锁定它,因此进入该方法可能需要一点时间。

谢谢!

1个回答

2
在Java中,有许多方法可以完成这项任务。其中一种方法是使用任何一个Lock对象,它具有一个tryLock(...)方法,允许您等待一定时间获取锁。如果成功获取锁,则返回true,否则返回false表示超时。在这里,ReentrantLock可能是一个不错的选择。
private final Lock lock = new ReentrantLock();
...

if (lock.tryLock(1L, TimeUnit.SECONDS)) {
   try {
      // we were able to lock
   } finally {
      // always unlock in a finally
      lock.unlock();
   }
} else {
   // trying to lock timed out without locking
}

在评论区的一些讨论后,我现在明白了您已经有了一些现有的同步方法,您希望只等待一定的时间。不幸的是,在Java中使用synchronized关键字没有办法做到这一点。


非常好!你知道它是否与同步方法兼容吗?换句话说,我猜想,在tryLock中是否可以在类对象上使用lock关键字?或者该类是否必须扩展Lock? - dakotapearl
我想,如果你扩展锁或者有一个公共锁,你必须确保每个想要调用的类都能正确实现tryLock、finally和else。 - dakotapearl
是的,那样做会很丑陋。同步的整个重点是不要持有锁太长时间。如果你正在这样做,那么也许你应该多了解一下Java中的并发性@dakotapearl:http://docs.oracle.com/javase/tutorial/essential/concurrency/ - Gray
当然。我觉得在那方面我表述不太准确。问题更多的是,我有一个预先编写好的类,其中包含同步方法,将被许多线程使用,但不一定会持续很长时间,因此等待时间可能会相当长。我想如果我的线程可以在此期间继续其他工作,并在稍后再次尝试,那就太好了。对此我感到抱歉。(已更正问题) - dakotapearl
很遗憾,没有办法设置一个带有超时时间的synchronized。 @dakotapearl - Gray
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接