tl; dr: реализует Runnable лучше. Тем не менее, оговорка важна
. В общем, я бы рекомендовал использовать что-то вроде Runnable
, а не Thread
, потому что это позволяет вам поддерживать вашу работу только в сочетании с вашим выбором параллелизма. Например, если вы используете Runnable
и позже решили, что на самом деле этого не требуется Thread
, вы можете просто вызвать threadA.run ().
Предостережение: здесь, Я категорически отвергаю использование необработанных потоков. Я предпочитаю использовать Callables и FutureTasks (Из javadoc: «Адаптивное асинхронное вычисление»). Интеграция тайм-аутов, правильная отмена и объединение потоков современной поддержки параллелизма для меня гораздо более полезны, чем груды необработанных потоков.
Последующие действия: существует конструктор FutureTask
, который позволяет использовать Runnables (если это то, что вам больше всего нравится), и по-прежнему пользоваться преимуществами современных инструментов параллелизма. Процитировать javadoc:
Если вам не нужен конкретный результат, подумайте об использовании конструкций формы:
Future> f = new FutureTask
Итак, если мы заменим их runnable
на ваш threadA
, мы получаем следующее:
new FutureTask
Другим вариантом, который позволяет вам оставаться ближе к Runnables, является ThreadPoolExecutor . Вы можете использовать метод execute для передачи в Runnable для выполнения «данной задачи в будущем».
Если вы хотите попробовать использовать пул потоков, вышеописанный фрагмент кода будет выглядеть примерно следующим образом (с использованием фабричного метода Executors.newCachedThreadPool () ):
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new ThreadA());