Ваш текущий код просто задерживает печать даты на 2 секунды. Это все еще будет с интервалом в 3 секунды.
Например: с датой начала x:
Без Thread.sleep вы будете печатать по адресу:
x, x + 3, x + 6, x + 9
С Thread.sleep вы будете печатать по адресу:
x + 2, x + 3 + 2, x + 6 + 2, x + 9 + 2
, что равно:
x + 2, x + 5, x + 8, x + 11 etc
Таким образом, между каждым отпечатком все еще есть задержка в 3 секунды.
См. Документацию по https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html
Каждый объект Timer соответствует одному фоновому потоку, который
используется для последовательного выполнения всех задач таймера. Таймер задач
должно завершиться быстро. Если задача таймера занимает слишком много времени для
завершено, это "захватывает" поток выполнения задачи таймера. Это может, в
включите, отложите выполнение последующих задач, которые могут «сгруппироваться»
и выполнить в быстрой последовательности, когда (и если) оскорбительное задание
наконец завершается.
Один и тот же поток будет использоваться для обработки каждого выполнения вашей задачи таймера. Когда задача выполняется, и она не завершается вовремя, пока таймер не запустит следующее выполнение задачи, следующее выполнение будет отложено до завершения предыдущего выполнения. Поведение аналогично ScheduledThreadPoolExecutor с размером пула потоков 1.