사용자에게 I/O 작업의 진행 상태를 알려주고 싶습니다. 현재 I/O를 시작하고 완료된 후에 중지하기 전에 내가 시작하는 내부 클래스가 있습니다. 그것은 다음과 같습니다CPU를 사용하는 진행 바 업데이트 프로그램
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
/O를 우리가 진행 한 얼마나 멀리 I에서 나타내는 내 외부 클래스의 필드입니다. 때로는 I/O가 이전 증분 업데이트를 완료하기 전에 내 업데이터를 완료하고 중지하기 때문에 중지 할 때 진행률을 100 %로 설정합니다. 그것은 단지 그것이 100 %에 있음을 보장합니다. 순간
ProgressUpdater updater = new ProgressUpdater(file.length());
updater.start();
//do I/O
//...
updater.stop();
문제는 루프가 꽤 심하게 CPU를 먹는 것입니다. 나는 거기에 기다림 (알림/알림)을 던지려고했지만 기다/알림을 사용할 때 내 스레드를 매달 렸을 때 내가 뭘하는지 모르겠다. 이렇게 많은 CPU주기를 사용하지 못하게하려면 어떻게해야합니까?
뭔가 나에게 잘못 보인다. 진행이 완료되지 않은 경우에도 루핑됩니다. 다시 반복 할 기다림이나 조건이 없습니다. 항상 실패 할지라도 백만 번 반복하여 'if (position> last)'테스트를 반복합니다. 이 일에는 어떤 종류의'sleep()'이 있어야합니다. – Havenard
당신은 즉시 물건을 업데이트 할 필요가 없습니다, 당신은 100ms마다 업데이 트하고 사용자에게 그것은 실시간 업데이 트와 다를 수 있습니다. – Havenard
@Havenard 나는 당신의 제안으로 끝났고, 나는 그곳에 잠을 더줬고 지금은 꿈처럼 작동합니다. 잊어 버린이 오래된 질문에 대답하고 싶다면 받아 들일 것입니다. – Logan