我有一个用于获取全局对象的静态方法:
public static Application getApplication() {
// ...
}
由于 I/O,Application
实例的创建需要时间,因此我们在单独的线程中创建它。在此期间,可能会发生其他线程尝试调用getApplication()
的情况。我想要的行为是让这些线程阻塞,直到创建全局 Application
实例。我基本上想要具有这种结构的东西:
private static Application application;
private static PromiseLikeLock lock = new PromiseLikeLock();
public static Application getApplication() {
lock.await();
return application;
}
// In thread:
application = new Application();
lock.release();
具有以下行为:
lock
对象是一个状态机,可以锁定或释放。它开始锁定。- 当线程调用
lock.wait()
时,如果锁被释放,它会正常进行,否则会阻塞。 - 调用
lock.release()
时,锁将被释放,并且所有在调用wait()
时阻塞的线程都会解除阻塞。
最佳答案
我认为这应该可以做到......使用 Java 7 API。
FutureTask<Application> ft =
new FutureTask<>(new Callable<Application>() {
public Application call() {
return new Application();
}});
new Thread(ft).start();
// Somewhere else / later on
Application app = ft.get();
javadoc对于 FutureTask
的描述如下:
A cancellable asynchronous computation. This class provides a base implementation of
Future
, with methods to start and cancel a computation, query to see if the computation is complete, and retrieve the result of the computation. The result can only be retrieved when the computation has completed; theget
methods will block if the computation has not yet completed. ....A
FutureTask
can be used to wrap aCallable
orRunnable
object. BecauseFutureTask
implementsRunnable
, aFutureTask
can be submitted to anExecutor
for execution.
您也可以将其传递给一次性线程
。
但坦率地说,您不应该为 Java 7 编写新代码。如果您使用 Java 8 语言功能,上面的内容会更清晰;例如应用程序::新
关于java - 如何在 Java 7 中实现 "promise like"线程同步系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60165695/