В следующем определении класса:
class MyClass:
"""A simple example class"""
def f(self):
return 'hello world'
Позволяет создать экземпляр вышеуказанного класса. Мы сделаем это, назначив class object, i.e. MyClass()
на var x
x = MyClass()
Здесь
И не забывайте, что function object MyClass.f
использовался для определения (внутри) method object x.f
, когда мы назначили x к MyClass ()
Согласно [1 115] Параллелизм Java на практике :
Timer
может быть чувствительно к изменениям в системных часах, ScheduledThreadPoolExecutor
не. Timer
имеет только один поток выполнения, таким образом, продолжительная задача может задержать другие задачи. ScheduledThreadPoolExecutor
может быть настроен с любым количеством потоков. Кроме того, Вы имеете полный контроль над созданными потоками, если Вы хотите (путем обеспечения ThreadFactory
). TimerTask
, уничтожают тот один поток, таким образом делая Timer
мертвый:-(..., т.е. запланированные задачи не будут больше работать. ScheduledThreadExecutor
не только ловит исключения на этапе выполнения, но и это позволяет Вам обработать их, если Вы хотите (путем переопределения afterExecute
метод от ThreadPoolExecutor
). Задача, которая выдала исключение, будет отменена, но другие задачи продолжат работать. , Если можно использовать ScheduledThreadExecutor
вместо [1 111], сделайте так.
Еще одна вещь..., в то время как ScheduledThreadExecutor
не доступно в библиотеке Java 1.4, существует Бэкпорт JSR 166 (java.util.concurrent
) к Java 1.2, 1.3, 1.4 , который имеет ScheduledThreadExecutor
класс.
Если это доступно Вам, то трудно думать о причине не для использования платформы Java 5 исполнителя. Вызов:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
даст Вам ScheduledExecutorService
со схожей функциональностью к Timer
(т.е. это будет однопоточным), но чей доступ может быть немного более масштабируемым (под капотом, это использует параллельные структуры, а не полную синхронизацию как с Timer
класс). Используя ScheduledExecutorService
также дает, Вы способствуете, такие как:
newScheduledThreadPoolExecutor()
или ScheduledThreadPoolExecutor
класс) О единственных причинах того, чтобы придерживаться Timer
, я могу думать:
ExecutorService является более новым и более общим. Таймер является просто потоком, который периодически выполняет материал, который Вы запланировали для него.
ExecutorService может быть пулом потоков, или выровнять распространение через другие системы в кластере и сделать вещи как одноразовое пакетное выполнение, и т.д.
Только посмотрели на то, что каждый предлагает решать.
Вот некоторые более хорошие методы вокруг использования Таймера:
http://tech.puredanger.com/2008/09/22/timer-rules/
В целом, я использовал бы Таймер для быстрого и грязного материала и Исполнителя для большего количества устойчивого использования.