#java #multithreading
#java #многопоточность
Вопрос:
Всем доброго времени суток, для одновременного запуска нескольких потоков целесообразно создавать разные объекты потоков из класса или создать два класса, где один реализует runnable, а другой расширяет поток, а затем создавать объекты потоков из них обоих по мере необходимости, предполагая, что мы пытаемся выполнить 7-10 задач одновременно.
- каковы наилучшие решения?..
- Есть ли какие-либо подводные камни или снижение производительности, если создавать разные объекты потоков из одного класса?.
Спасибо. Советы, как всегда, приветствуются.
Комментарии:
1. Поток и процесс — это две разные вещи. Если вы имеете в виду поток, то используйте термин «поток», а не термин «процесс».
2. Вы действительно имеете в виду процессы операционной системы? Это то, что обычно означает processes в контексте программирования; если вы на самом деле имеете в виду задания или tasks, избегайте использования слова process, потому что это собьет с толку других программистов.
Ответ №1:
- Взгляните на отличный
java.util.concurrent
пакет - Создание разных объектов потоков из одного класса не создает проблем с производительностью
Вот краткий пример:
private static class SomeTask implements Runnable
{
@Override
public void run()
{
doSomething();
}
}
public static void main(String[] args)
{
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 8; i ) executor.execute(new SomeTask());
}
Ответ №2:
Я бы лично выбрал вариант (1) (создание 2 разных потоков одного и того же класса).
Я не чувствую необходимости создавать 2 разных класса для задания, которое может выполняться 2 разными потоками одного и того же класса.
Ответ №3:
Я не думаю, что имеет значение, каким способом вы это делаете. Если у вас будет много потоков с коротким сроком службы, вам, вероятно, понадобится пул потоков, см. java.util.concurrent.Исполнители. Обычно я создаю анонимный класс типа runnable, например
executor.execute(new Runnable() {
//thread code goes here
});
Ответ №4:
Существует небольшая разница в производительности между созданием потока путем расширения Thread или путем реализации Runnable и использованием new Thread(runnable)
. Использование одного класса или нескольких также не имеет значения. Вы должны спроектировать свою структуру классов на основе предстоящей работы; если два потока выполняют одинаковую работу с разными данными, используйте один и тот же класс для обоих.
Доступ к общим данным (будь то статические переменные класса или что-то еще) всегда является большой проблемой.
Ответ №5:
Главное, что имеет значение, — это то, как вы спроектировали свою иерархию объектов: если вы расширяете класс Thread, вы не можете расширять какие-либо другие классы (Java — это одиночное наследование). таким образом, реализуя Runnable, вы все еще можете расширять другие классы в своей модели домена.