gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:04:03 25 4
gpt4 key购买 nike

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

最佳答案

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

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

下载文件时不需要按住监视器,仅在更改共享变量时 - 试试这个

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

其中 T 是 fileList 的适当类型

关于java - 如何在java中使用Object.wait(long)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19078901/

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