Одновременный запуск нескольких потоков

#java #multithreading

#java #многопоточность

Вопрос:

Всем доброго времени суток, для одновременного запуска нескольких потоков целесообразно создавать разные объекты потоков из класса или создать два класса, где один реализует runnable, а другой расширяет поток, а затем создавать объекты потоков из них обоих по мере необходимости, предполагая, что мы пытаемся выполнить 7-10 задач одновременно.

  1. каковы наилучшие решения?..
  2. Есть ли какие-либо подводные камни или снижение производительности, если создавать разные объекты потоков из одного класса?.

Спасибо. Советы, как всегда, приветствуются.

Комментарии:

1. Поток и процесс — это две разные вещи. Если вы имеете в виду поток, то используйте термин «поток», а не термин «процесс».

2. Вы действительно имеете в виду процессы операционной системы? Это то, что обычно означает processes в контексте программирования; если вы на самом деле имеете в виду задания или tasks, избегайте использования слова process, потому что это собьет с толку других программистов.

Ответ №1:

  1. Взгляните на отличный java.util.concurrent пакет
  2. Создание разных объектов потоков из одного класса не создает проблем с производительностью

Вот краткий пример:

 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, вы все еще можете расширять другие классы в своей модели домена.