java - 如何在 Java 7 中实现 "promise like"线程同步系统?

标签 java android multithreading java-7

我有一个用于获取全局对象的静态方法:

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();

具有以下行为:

  1. lock 对象是一个状态机,可以锁定释放。它开始锁定。
  2. 当线程调用 lock.wait() 时,如果锁被释放,它会正常进行,否则会阻塞。
  3. 调用 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; the get methods will block if the computation has not yet completed. ....

A FutureTask can be used to wrap a Callable or Runnable object. Because FutureTask implements Runnable, a FutureTask can be submitted to an Executor for execution.

您也可以将其传递给一次性线程


但坦率地说,您不应该为 Java 7 编写新代码。如果您使用 Java 8 语言功能,上面的内容会更清晰;例如应用程序::新

关于java - 如何在 Java 7 中实现 "promise like"线程同步系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60165695/

相关文章:

c# - 取消 NamedPipeClientStream.Read 调用

使用谷歌应用程序的 Java 序列化不起作用

java - 调用 WebElement 列表的单个索引

java - 在 JUnit 5 中运行标记测试的特定设置

java - 如何修复此代码以在 Android 应用程序的 Activity 之间传递数据?

android - 在android中选择特定类型的文件

ios - 在单个 NSOperationQueue iOS 中管理多个操作,例如暂停/恢复单个操作

Java - 单击时使用 JComponent 将新图像添加到 Jframe

java - 正确缩放 BigDecimal

android - 重新连接到互联网时显示进度条