Задача Java Timer.schedule вообще не запускается - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть это:

import java.util.Timer;
import java.util.TimerTask;

    public class useTimerTask {
        public static void main(String[] args){
            Timer timer = new Timer(true);
            timer.schedule(new TimerTask() {
                public void run() {
                    System.out.println("abc");
                }
            }, 200000 , 1000);
        }
    }

Я ожидал, что после запуска этой программы на экране будет периодический вывод.Но когда я запускаю его внутри intelliJ, кажется, что он сразу завершается, ничего не печатая.

Что случилось?Как это исправить?

1 Ответ

0 голосов
/ 30 ноября 2018

Прежде всего, вам необходимо удалить параметр из конструктора Timer.Передав true, вы указываете, что поток является «демоном»: поток демона не препятствует выходу JVM, когда все потоки, не являющиеся демонами, завершены.

Во-вторых, вы устанавливаете параметр задержки в200 минутЭто означает, что вам нужно подождать 200 минут, прежде чем программа начнет повторять печать.Ниже приведена рабочая версия:

       Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("abc");
            }
        }, 100 , 1000);

Если вы установите таймер в качестве демона, JVM увидит, что активных потоков нет, и просто остановит завершение вашей программы, когда инструкция таймера планирования закончилась.Но если вы удалите параметр «true» из конструктора Timer, он будет виден как активный поток, это означает, что программа не остановится, пока этот таймер не завершит свою работу.

Ниже код показывает эту ситуацию.Таймер будет работать в течение 10 секунд, потому что вы спите основной поток, а таймер (deamon) будет работать до тех пор, пока этот сон не закончится.

    Timer timer = new Timer(true);
    timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("abc");
        }
    }, 100 , 1000);

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
...