1

У меня есть JButton, чтобы вызывать мою тему. Но то, что я на самом деле хочу сделать, это остановить поток сразу после одной минуты! Мой ActionListener Метод:Остановить тему сразу после одной минуты

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    new Frame2().setVisible(true); 
    Thread t=new Thread(new Frame2()); 

    t.start(); 
    }  

Моя нить для запуска только одна минута выглядит следующим образом:

public void run(){ 
    int i; 
    while(!Thread.currentThread().isInterrupted()){ 
     for(i=0;i<=100;i++){ 

      if(i==100){ 
      Thread.currentThread().interrupt(); 
      } 
     try { 
      Thread.currentThread().sleep(600); 
     } catch (InterruptedException ex) { 
      System.out.print("THREAD CLOSED"); 
      return; 
     } 

    } 
     System.out.print("DOING THINGS BLA BLA"); 
    } 

}  

Проблема: я остановил нить через одну минуту успешно , но я не смог ничего сделать в этом. Я просто хочу знать, как я могу достичь этого, чтобы запустить поток только на одну минуту, и внутри потока я хочу делать свои вещи! Но как? Неужели я ошибаюсь в этом подходе? Если да, то какой должен быть правильный подход?

+0

Почему бы просто не делать то, что вы хотите, прямо перед тем, как вы вызовете «Thread.currentThread(). Interrupt();» ? –

+1

Вы должны объяснить, что вы собираетесь делать в этой теме –

ответ

4

Самый простой способ сделать то, что вы хотите иметь что-то вроде следующего:

public void run() { 
    long startTime = System.currentTimeMillis(); 
    while (System.currentTimeMillis() < startTime + 60000) { 
     // do something useful 
    } 
} 

«сделать что-то полезное» должны быть быстро операции, и ваш поток всегда будет длиться немного дольше, чем 1 минуту (1 минута + время «сделать что-нибудь полезное»).

Примечание о вашем исходном коде: чтобы остановить поток из самой нити, нет необходимости в прерывании: вам просто нужно вернуться из метода run().

+0

Я использую эту логику, но как выйти из этого цикла while по истечении необходимого времени? –

+0

Цикл wile останавливается после времени regueire, потому что System.currentTimeMillis() возвращает текущее время каждый раз, когда выполняется условие цикла. –

+0

Как обеспечить, чтобы я вышел из цикла while, если моя задача достаточно коротка и завершена до времени ожидания. E.g. Если «// сделать что-то полезное» завершается через 10 секунд, я не хочу, чтобы он выполнял его внутри цикла while - 1 минута - это просто максимальный тайм-аут, который я хочу, а не «обязательный»/минимальный - я просто представляю Булевский флаг, чтобы сохранить статус задачи, использовать «break» или есть лучший способ? – Tintin

2

Чтобы убедиться, что ваш поток будет работать 1 минуту, вам нужно создать для этого отдельный поток.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    new Frame2().setVisible(true); 
    final Thread t=new Thread(new Frame2()); 

    t.start(); 
    new Thread(new Runnable() { 
    @Override 
    public void run() { 
     TimeUnit.SECONDS.sleep(1); 
     t.interrupt(); 
    } 
    }).start(); 
} 

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

+0

Если это сработает, я буду так благодарен вам, пожалуйста, подождите мой знак! –

+1

прерывание потока не убивает его. –

+0

Да, вы правы, поток «t» должен проверять на 'if (Thread.interrupted())', а затем, например, throw 'InterruptedException', чтобы остановить выполнение. Это, я считаю, самый рекомендуемый вариант. Теоретически вы можете использовать устаревший 'Thread.stop()', но он устарел, и вы не должны :). –

 Смежные вопросы

  • Нет связанных вопросов^_^