public class MyTimerTask extends TimerTask{
@Override
public void run() {
int i = 0;
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Run Me ~" + ++i);
System.out.println("Test");
}
}
Case 1 :-
TimerTask task = new MyTimerTask();
Timer timer = new Timer();
timer.schedule(task, 1000,6000); // line 1
System.out.println("End"); // here is bebug point.
Мое ожидание метода schedule()
(согласно моему пониманию, приведенному в javadocs
, где каждое выполнение запланировано после завершения выполнения предыдущей задачи), что два потока должны быть созданы после строки 1.
Один для timer
, который порождает другой поток для задач. После того, как первый поток задачи умрет, будет создан другой и запущен. Но в точке отладки я вижу только один поток, соответствующий Timer
. Почему бы не использовать поток для задач, которые реализуют Runnable
?
Case 2 :-
TimerTask task = new MyTimerTask();
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, 1000,6000); // line 1
System.out.println("End"); // here is bebug point.
Мое ожидание метода scheduleAtFixedRate()
(согласно моему пониманию, приведенному в javadocs, где каждое выполнение запланировано относительно запланированного времени выполнения начального выполнения), что около 17 потоков (не обращайте особого внимания на 17. Это может быть более или менее к этому. Но он должен быть больше 2 ) должен быть создан после строки 1.
Один для timer
, который должен породить 16 других потоков, соответствующих двум каждой задаче. Если первая задача приостанавливается на 100 секунд, Timer
должен создать другой поток, соответствующий следующей задаче, и аналогично для другой задачи. Но в точке отладки я вижу только один поток, соответствующий Timer
. Здесь также я вижу последовательное выполнение задачи. Почему не 17 потоков?
ОБНОВЛЕНИЕ: – согласно ScheduleAtFixedRate javadocs, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up. what does that mean?
Мне кажется, что если вторая задача должна быть выполнена, даже если первая задача не завершена, то таймер создаст новый поток для выполнения задачи . Не так ли?