gpt4 book ai didi

java - 进度条更新程序占用 CPU

转载 作者:行者123 更新时间:2023-11-29 09:48:51 25 4
gpt4 key购买 nike

我想让我的用户了解 I/O 操作的进度。目前我有一个内部类,它在我开始 I/O 之前启动并在它完成后停止。它看起来像这样:

class ProgressUpdater implements Runnable {

private Thread thread;
private long last = 0;
private boolean update = true;
private long size;

public ProgressUpdater(long size) {
this.size = size;
thread = new Thread(this);
}

@Override
public void run() {
while (update) {
if (position > last) {
last = position;
double progress = (double) position / (double) size * 100d;
parent.setProgress((int) progress);
}
}
}

public void start() {
thread.start();
}

public void stop() {
update = false;
parent.setProgress(100);
}
}

parent 是我对我的 UI 的引用,position 是我外部类中的一个字段,表示我们在 I/O 中的进展情况。我在停止时将进度设置为 100%,因为有时 I/O 完成并停止我的更新程序,然后它才能完成更新先前的增量。这只是确保它处于 100%。

目前,这是可行的,我是这样使用它的:

ProgressUpdater updater = new ProgressUpdater(file.length());
updater.start();
//do I/O
//...
updater.stop();

问题是循环非常严重地消耗 CPU。我尝试在其中加一个锁(带有等待/通知),但我不知道在使用等待/通知时我在做什么,所以它只是挂起我的线程。我该怎么做才能阻止它使用这么多 CPU 周期?

最佳答案

您应该考虑使用 SwingWorker .基本上,您在 SwingWorker 提供的后台线程上执行所有 IO,并且有向 swing 线程报告进度的内置方法。

然后无论何时更新该位置,您都可以自动更新进度,而不是不断轮询,这是您目前所做的。

看看Swingworker TimeoutSwingWorker with FileReader看看是否有帮助。

另一种解决方案,如果您不想使用 SwingWorker,可能只是直接更新进度条,而不是更新 position 值,通过这样的调用:

SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
getMyProgressBar().setValue(position);
}
});

假设您已设置进度条,使其最大值为文件大小。

关于java - 进度条更新程序占用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15710814/

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