Thread.sleep приостанавливает всю программу - PullRequest
0 голосов
/ 26 мая 2011

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

Это код в слушателе действия кнопки:

 Counter c = new Counter(timeToFinish);

Это код для класса Counter:

class Counter implements Runnable {

        int waitingTime = 0;
        Thread myCounter = new Thread(this);

        public Counter(int waitingTime)
        {
            this.waitingTime = waitingTime;
            myCounter.run();
        }

        public void run(){

            //Start countdown:
            do  
            {

                waitingTime -= 1;

                try {

                    Thread.sleep(1000);
                    System.out.println(waitingTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } while (waitingTime >= 0);

        }
    }

Проблема в том, что когда я создаю новый экземпляр класса Counter, он приостанавливает всю программу, а не только этот поток!Проблема должна быть с "Thread.sleep".

Ответы [ 6 ]

6 голосов
/ 26 мая 2011

Поскольку вы напрямую вызываете метод run .

Вместо этого вы должны обернуть его в поток и запустить поток.

Например, заменить

myCounter.run();

по

new Thread(this).start();
3 голосов
/ 26 мая 2011

Только потому, что вы вызываете метод run из конструктора Counter. Это не так, как это работает с потоками. Вам придется удалить этот вызов, обернуть Runnable в Thread экземпляр и вызвать start() в потоке:

 new Thread(new Counter(2)).start();
1 голос
/ 26 мая 2011

Вы на самом деле не start() несколько потоков.

Метод Thread.run() просто запускает код, связанный с потоком, как любая другая обычная функция. Он не запускает отдельный поток.

Вам нужно позвонить Thread.start(), чтобы начать новый поток и запустить в нем свой код.

0 голосов
/ 26 мая 2011

Вы вызываете run напрямую, он будет работать в текущем потоке и спать в текущем потоке, который, я думаю, является потоком событий. Это вызывает паузу в вашей программе.

0 голосов
/ 26 мая 2011

Вы должны использовать start() метод вашей темы. Используйте

c.start();

в противном случае у вас есть класс, и вы вызываете один из его методов, и, конечно, он работает в основном потоке и спит в основном потоке.

0 голосов
/ 26 мая 2011

Вы должны использовать класс SwingUtilities

см

http://www.java2s.com/Code/Java/Threads/InvokeExampleSwingandthread.htm

    // Report the result using invokeLater().
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        resultLabel.setText("Ready");
        setEnabled(true);
      }
    });
  }
};
...