Что более желательно для создания потока путем расширения класса Потока или реализации Выполнимый? [дубликат]

7
задан giri 2 March 2010 в 21:00
поделиться

4 ответа

Вы должны сделать его Runnable , а затем добавить его в любой из существующих классов пула потоков. Вы инкапсулируете свою единицу работы в новый класс, а затем используете поток для его запуска.

Вы могли бы расширить Thread , только если бы вы что-то делали с самим классом потока, например, расширяли его новыми функциями. Я сомневаюсь, что это так.

Альтернативой было бы создание нового класса, который был бы композицией потока и вашей пользовательской логики, например у него есть Thread внутри и собственный метод execute (), в котором он планирует поток и добавляет (this) в качестве рабочего элемента, полностью скрытого снаружи ... Но в этом случае вы были бы делая ваш класс Runnable в любом случае, просто предоставляя удобный метод, упрощающий его добавление в поток.

9
ответ дан 6 December 2019 в 21:12
поделиться

Если вы расширяете Thread, вам всегда нужно вызывать .start (), который запускает НОВЫЙ поток и выполняет задача.

Если вы сделаете его Runnable, вы также можете сделать new Thread (runnable) .start (), но вы не ограничены этим. Вы можете повторно использовать потоки, тем самым сохраняя некоторые ресурсы следующим образом:

ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
service.execute(runnable);
service.execute(someOtherTask);

Сначала поместите несколько исполняемых файлов в список, а затем выполняйте их, когда вам захочется их выполнить:

List<Runnable> todoList = new ArrayList<Runnable>();
Runnable fetchPaper = new Runnable("paper");
todoList.add(fetchPaper);
Runnable fetchMilk = new Runnable("milk");
todoList.add(fetchMilk);

//do something else or even return todoList...
ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
for(Runnable task : todoList){
    recycleSingleThread.execute(task);
}

Или вы даже можете сделать

runnable.run();

в своем собственном нить.

Возможно, вы даже можете сохранить исполняемый файл, потом десериализовать его и запустить.
Всей этой гибкости не будет, если вы расширите Thread.

2
ответ дан 6 December 2019 в 21:12
поделиться

Создание экземпляра Runnable дает более четкое разделение между вашим кодом и реализацией потоков. Интерфейс Runnable просто заявляет, что вы можете запустить этот код в другом потоке.

Кроме того, поскольку вы можете реализовать множество интерфейсов, но расширить только один класс, вы можете предоставить свой собственный суперкласс, только если вы реализуете Runnable. Если вы расширите Thread, у вас не может быть другого суперкласса.

Единственное предостережение, связанное с Runnable, состоит в том, что вам нужны два объекта: один экземпляр Thread для фактического выполнения кода и один из ваших реализаций Runnable для предоставления кода.

1
ответ дан 6 December 2019 в 21:12
поделиться

Выполнение, потому что вы не добавляете специализированное поведение к классу Thread - вы просто отмечаете свою логику как способную работать как отдельный поток.

0
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: