不幸的是,我对如何正确设置线程的理解非常糟糕。我知道在 SO.SE 和其他网站上都有大量关于此的信息,但我似乎无法将我正确阅读的内容与我正在做的事情联系起来。
我的问题是我有一种方法,它采用两个参数,其中一个参数除以另一个参数。商(结果)用于填充可视进度条。当商达到 1, 时(readBytes/contentLength == 1)
,我希望某个线程(我猜)在从布局中删除进度条之前等待给定时间。我知道将值设置为进度条所需的所有代码以及如何将其从视图中删除,我的问题是如何让它等待,例如,在触发操作以删除组件之前等待 2000 毫秒?
这可能是基本的线程知识,但我遇到了很大的问题。
到目前为止,我已经尝试了这两种方法:
@Override
public void updateProgress(long readBytes, long contentLength) {
this.contentLength = contentLength;
if(readBytes != 0 && contentLength != 0 && fileListItem != null) {
fileListItem.getProgressIndicator().setValue(readBytes/contentLength);
synchronized (this) {
while(readBytes/contentLength != 1) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
fileListItem.removeProgressIndicator();
}
}
}
if(!itemIsAdded) {
checkFileCompatibility(contentLength);
}
}
和
@Override
public void updateProgress(long readBytes, long contentLength) {
this.contentLength = contentLength;
if(readBytes != 0 && contentLength != 0 && fileListItem != null) {
if(readBytes/contentLength == 1) {
Thread t = new Thread();
t.start();
try {
t.wait(2000);
fileListItem.removeProgressIndicator();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.interrupt();
} else {
fileListItem.getProgressIndicator().setValue(readBytes/contentLength);
}
}
if(!itemIsAdded) {
checkFileCompatibility(contentLength);
}
}
没有成功。在第一个示例中,主线程似乎是等待的线程,没有任何反应。在第二个示例中,我在t.wait(2000);
. 我不知道该怎么做。。
编辑:根据 Bohemian 的意见,我得到了它的工作。
@Override
public void updateProgress(final long readBytes, final long contentLength) {
this.contentLength = contentLength;
if(readBytes != 0 && contentLength != 0 && fileListItem != null) {
if(!threadIsRunning) {
new Thread(new Runnable() {
@Override
public void run() {
threadIsRunning = true;
while(!fileIsAdded) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOGGER.error(e.getMessage());
break;
}
}
fileListItem.removeProgressIndicator();
threadIsRunning = false;
}
}).start();
}
fileListItem.getProgressIndicator().setValue(readBytes/contentLength);
if(readBytes == contentLength)
fileIsAdded = true;
}
if(!itemIsAdded) {
checkFileCompatibility(contentLength);
}
}
它仍然需要一些整理,但基础现在正在工作!