0

我现在正在尝试将更新检查模块添加到我的程序中。该方法是处理网站以获取更新信息。但在某些情况下,网站无法访问,程序会在 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)?

4

2 回答 2

1

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

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

下载文件时不需要拿着监视器,只有在改变共享变量时才需要 - 试试这个

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

其中 T 是 fileList 的适当类型

于 2013-09-29T14:16:32.090 回答
0

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

远离downloadFile.start()同步块。

于 2013-09-29T14:03:06.723 回答