Таймер Java - выполнить задачу, подождать, выполнить задачу. Нет Thread.sleep()

У меня есть программа, в которой я пытаюсь выполнить задачу, подождать секунду, переместить индикатор выполнения, а затем выполнить другую задачу, подождать, индикатор выполнения, выполнить и т. д.

Если я использую

Thread.sleep()

он замораживает мой графический интерфейс, не позволяя моему индикатору выполнения двигаться. Я пробовал следующие вопросы:

Как установить таймер в java

Заставить что-то ждать без использования Thread.sleep()?

Заставьте Java-программу спать без потоков

Мой код похож на этот:

import java.util.*

...

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(16);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(32);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(48);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(64);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(80);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(100);
        progressBar.setString("Done!");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {

            }
        }, 1000);
        System.exit(0);

Заранее благодарю за любую помощь.

Riccorbypro


person Riccorbypro    schedule 17.07.2014    source источник
comment
Вам нужно будет запустить свой графический интерфейс в отдельном потоке, чем ваши задачи.   -  person Arno_Geismar    schedule 17.07.2014
comment
it freezes my GUI, not allowing my progress bar to move. Вам необходимо реализовать фоновые задачи (включая ожидание) в отдельном потоке. Взгляните на этот вопрос   -  person default locale    schedule 17.07.2014
comment
@defaultlocale Я пробовал SwingWorker, но безрезультатно. Что еще я могу попробовать?   -  person Riccorbypro    schedule 17.07.2014
comment
@Riccorbypro Что пошло не так с SwingWorker? Вы можете попробовать создать потоки самостоятельно, но SwingWorker.doInBackground должен сделать то же самое.   -  person default locale    schedule 17.07.2014
comment
Я использую IDE NetBeans, поэтому, когда код подчеркнут красным, я знаю, что что-то не так. После того, как я вставил SwingWorker, используя знания, полученные от Java API, все стало красным, и моя программа даже не запустилась. Затем я удалил сегмент кода, и он снова заработал нормально.   -  person Riccorbypro    schedule 17.07.2014


Ответы (1)


Любая обработка должна происходить в потоке, отдельном от потока графического интерфейса (EDT), чтобы гарантировать, что когда вы вызываете спящий режим в потоке, графический интерфейс по-прежнему отвечает. Таким образом, все, что вы делаете для измерения прогресса или его эмуляции, должно происходить в потоке, отличном от графического интерфейса.

Взгляни на:

Swing Workers

Индикаторы выполнения

person robzillaDev    schedule 17.07.2014