作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在正在尝试将更新检查模块添加到我的程序中。该方法正在处理网站以获取更新信息。但在某些情况下,网站无法访问,程序会在 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/
我是一名优秀的程序员,十分优秀!