如何在java中使用Object.wait(long)?

时间:2013-09-29 13:59:31

标签: java wait

我现在正在尝试将更新检查模块添加到我的程序中。该方法正在处理网站以获得更新信息。但在某些情况下,网站无法访问,程序会在0.5秒内停止检查。为了实现这一点,我写了这些代码:

int[] lock = new int[0];
boolean fileListGot = false;

Thread downloadFile = new Thread() {
    public void run() {
        synchronized (lock) {
            fileList = HttpFetcher.fetch("http://*****/****");
            fileListGot = true;
            lock.notify();
        }
    }
};

synchronized (lock) {
    downloadFile.start();
    lock.wait(500);
}

return fileListGot;

但该计划在0.5秒后没有停止。该计划有什么问题?以及如何使用Object.wait(long)?

2 个答案:

答案 0 :(得分:1)

阅读Object.notify javadocs - 重要的部分是“唤醒的线程将无法继续,直到当前线程放弃对此对象的锁定。”

主线程获取lock的监视器。它启动工作线程。工作线程试图获得lock的监视器,但不能。主线程然后调用lock.wait(500),因此丢失了监视器。工作线程然后获得监视器并继续。如果下载仍然在500ms后继续,则等待返回并且主线程尝试获取监视器,但它仍然拥有工作线程。

下载文件时不需要按住显示器,只有在改变共享变量时才这样做 - 试试这个

public void run() {
    T temp = HttpFetcher.fetch("http://*****/****");
    synchronized (lock) {
        fileList = temp;
        fileListGot = true;
        lock.notify();
    }
}

其中T是fileList的适当类型

答案 1 :(得分:0)

您输入synchronized块然后启动一个线程。线程的运行尝试进入synchronized块并永远等待,因为你已经从另一个线程获取了相同的锁。

downloadFile.start()移离同步块。