gpt4 book ai didi

java - 等待一个对象被初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:37 25 4
gpt4 key购买 nike

我有一个正在单独线程中初始化的对象。在填充本地数据库时,初始化可能需要几秒钟。

SpecialAnalysis currentAnalysis = new SpecialAnalysis(params_here);

我正在尝试实现一个“取消”按钮,它将对象的 isCancelled boolean 值设置为 true。实现它的正确 Java 方法是什么?

while (currentAnalysis == null) {
}
currentAnalysis.cancel();

此方法会卡住程序,因为它似乎已进入计算效率低下的循环。在这种情况下我可以使用 Object.wait() 吗?

我目前不好/半成功的解决方案是:

while (currentAnalysis == null) {
Thread.sleep(500);
}
currentAnalysis.cancel();

谢谢!

最佳答案

首先,Object.wait()Object.notify()/Object.notifyAll() 是您所需要的。是否直接使用它们是另一回事。由于直接使用 wait/notify 编程容易出错,因此通常建议使用 concurrency tools added in Java 1.5 (参见下面的第二种方法)。


传统的等待/通知方法:

初始化:

    synchronized (lockObject) {
SpecialAnalysis currentAnalysis = new SpecialAnalysis(params_here);
lockObject.notifyAll();
}

在“取消”线程中:

    synchronized (lockObject) {
while (currentAnalysis == null) {
try { lockObject.wait(); }
catch Exception(e) { } // FIXME: ignores exception
}
}
currentAnalysis.cancel();

当然,这些可以是同步方法而不是 block 。您对 lockObject 的选择将取决于您需要多少“取消”线程等。理论上它可以是任何东西,即 Object lockObject = new Object(); 只要你要小心正确的线程可以访问它。

请注意,由于可能会出现 spurious wakeups,所以将对 wait() 的调用放在 while 循环中很重要。来自底层操作系统。


一个更简单的方法是使用 CountDownLatch,让您免于 wait()notify() 的具体细节:

(我在这里做了几个假设,以便提出一种可能更简洁的方法)。

    class AnalysisInitialiser extends Thread {

private CountDownLatch cancelLatch = new CountDownLatch(1);
private SpecialAnalysis analysis = null;

@Override
public void run() {
analysis = new SpecialAnalysis(params);
cancelLatch.countDown();
}

public SpecialAnalysis getAnalysis() {
cancelLatch.await();
return analysis;
}
}

然后在需要发送取消信号的线程中:(显然你需要以某种方式获取AnalysisInitialiser对象)

    analysisInit.getAnalysis.cancel();

没有并发原始样板,耶!

关于java - 等待一个对象被初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com