Java 正在等待初始化对象

Java 正在等待初始化对象,java,wait,Java,Wait,我有一个正在单独线程中初始化的对象。在填充本地数据库时,初始化可能需要几秒钟 SpecialAnalysis currentAnalysis = new SpecialAnalysis(params_here); 我试图实现一个“取消”按钮,它将对象的isCancelled布尔值设置为true。实现这一点的正确Java方法是什么 while (currentAnalysis == null) { } currentAnalysis.cancel(); 此方法冻结程序,因为它似乎已进入计算效率

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

SpecialAnalysis currentAnalysis = new SpecialAnalysis(params_here);
我试图实现一个“取消”按钮,它将对象的
isCancelled
布尔值设置为true。实现这一点的正确Java方法是什么

while (currentAnalysis == null) {
}
currentAnalysis.cancel();
此方法冻结程序,因为它似乎已进入计算效率低下的循环。在这种情况下,我是否可以使用
Object.wait()

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

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

谢谢

我喜欢这个问题,所以投票通过了

你可以像下面这样做

    do {
    if(currentAnalysis != null){
    currentAnalysis.cancel();
    }
   }
     while (currentAnalysis == null)
在这里,您的
do
不断检查
currentAnalysis
的值,一旦其
不为空
则执行
cancel
否则保持
循环
并检查
currentAnalysis


这是我现在发现的一种更好的方法。首先,是的
对象。wait()
对象。notify()
/
对象。notifyAll()
是您需要的。你是否直接使用它们是另一回事。由于直接使用
wait/notify
编程容易出错,因此通常建议使用(参见下面的第二种方法)


传统的
等待/通知方法:

初始化:

    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();
当然,这些可以是同步方法,而不是块。您选择的
lockObject
将取决于您需要多少“取消”线程等。理论上,它可以是任何线程,即
Object lockObject=new Object()只要小心,正确的线程就可以访问它

请注意,由于可能来自底层操作系统,因此在此处将对
wait()
的调用置于while循环中非常重要


一种更简单的方法是使用
倒计时闩锁
,这样就不用再使用
wait()
&
notify()

(我在这里做了一些假设,以提出一种可能更干净的方法)

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


没有并发原始样板,耶

您是否尝试过while(currentAnalysis.equals(“null”){…}如果currentAnalysis为null,
currentAnalysis.equals(“null”)
将抛出NullPointerException这将导致一个繁忙的循环,在初始化对象时将CPU核心固定为100%:-/感谢您提供了一个很好的解决方案。在这种情况下,信号量似乎比倒计时锁更合适:我将尝试您的第一种方法(使用监视器,如果这是正确的术语的话?)。这里也有很好的资源:谢谢@威震天:谢谢,无论如何,使用基于监视器的方法,它对教育肯定是有用的。只要小心,每次在代码中添加
synchronized
wait/notify
时,都会增加活跃性错误的可能性。我们的大脑并不擅长对复杂的并发系统进行推理!好吧,我尝试了一些方法,倒计时锁工作得非常好!非常感谢您提供此解决方案。强烈推荐!对我来说,编码比监视器或信号量更简单听上去很棒:-)我推荐这本书,它涵盖了所有基于监视器的
wait/notify
内容以及
java.util.concurrent
工具:(唯一缺少的是新的
fork/join
和最近的JavaSE版本中基于流的API)。
    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;
        }
    }
    analysisInit.getAnalysis.cancel();