использовать Thread и когда использовать Threadpool? [Дубликат]

Строки сами по себе неизменяемы, но вы можете легко создать обратную копию со следующим кодом:

function reverseString(str) {

  var strArray = str.split("");
  strArray.reverse();

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");
37
задан andersoj 21 October 2010 в 20:31
поделиться

7 ответов

Действительно ли это дорого для создания нового потока?

В качестве эталона я создал 60 000 потоков с Runnable s с пустым run() методами. После создания каждого потока я немедленно вызвал его метод start(..). Это заняло около 30 секунд интенсивной работы процессора. Аналогичные эксперименты были выполнены в ответ на этот вопрос . Резюме состоит в том, что если потоки не заканчиваются сразу, а большое количество активных потоков накапливается (несколько тысяч), тогда будут проблемы: (1) каждый поток имеет стек, поэтому у вас закончится нехватка памяти , (2) может быть ограничение на количество потоков на процесс, налагаемый ОС, но не обязательно, кажется .

Итак, насколько я могу видеть , если мы говорим о запуске сказать 10 потоков в секунду, и все они заканчиваются быстрее, чем новые, и мы можем гарантировать, что этот показатель не будет превышен слишком сильно, тогда ExecutorService не предлагает каких-либо конкретных преимуществ в видимой производительности или стабильности. (Хотя он все же может сделать его более удобным или читаемым, чтобы выразить определенные идеи параллелизма в коде.) С другой стороны, если вы можете планировать сотни или тысячи задач в секунду, что требует времени для запуска, вы можете столкнуться с большими проблемами сразу. Это может произойти неожиданно, например. если вы создаете потоки в ответ на запросы на сервер, и есть интенсивность запросов, которые получает ваш сервер. Но, например, один поток в ответ на каждое событие ввода пользователя (нажатие клавиши, движение мыши) кажется совершенно прекрасным, если задачи кратки.

39
ответ дан Community 17 August 2018 в 15:52
поделиться

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

Структура исполнителей облегчает процесс создания пулов потоков в java. Класс исполнителей обеспечивает простую реализацию ExecutorService с использованием ThreadPoolExecutor.

Источник:

Что такое Executors Framework

0
ответ дан Aftab Virtual 17 August 2018 в 15:52
поделиться

До версии java 1.5 Thread / Runnable был разработан для двух отдельных сервисов

  1. Единица работы
  2. Выполнение этой единицы работы

ExecutorService отделяет эти две службы, обозначая Runnable / Callable как единицу работы и Исполнитель в качестве механизма для выполнения (с использованием жизненного цикла) единицы работы

0
ответ дан Anil Saha 17 August 2018 в 15:52
поделиться

ExecutorService также предоставляет доступ к FutureTask, который вернет вызывающему классу результаты фоновой задачи после завершения. В случае реализации Callable

public class TaskOne implements Callable<String> {

@Override
public String call() throws Exception {
    String message = "Task One here. . .";
    return message;
    }
}

public class TaskTwo implements Callable<String> {

@Override
public String call() throws Exception {
    String message = "Task Two here . . . ";
    return message;
    }
}

// from the calling class

ExecutorService service = Executors.newFixedThreadPool(2);
    // set of Callable types
    Set<Callable<String>>callables = new HashSet<Callable<String>>();
    // add tasks to Set
    callables.add(new TaskOne());
    callables.add(new TaskTwo());
    // list of Future<String> types stores the result of invokeAll()
    List<Future<String>>futures = service.invokeAll(callables);
    // iterate through the list and print results from get();
    for(Future<String>future : futures) {
        System.out.println(future.get());
    }
1
ответ дан Bade 17 August 2018 в 15:52
поделиться

Преимущество, которое я вижу, заключается в управлении / планировании нескольких потоков. С помощью ExecutorService вам не нужно писать свой собственный менеджер потоков, который может быть запутан с ошибками. Это особенно полезно, если ваша программа должна запускать сразу несколько потоков. Например, вы хотите выполнить два потока за раз, вы можете легко сделать это следующим образом:

ExecutorService exec = Executors.newFixedThreadPool(2);

exec.execute(new Runnable() {
  public void run() {
    System.out.println("Hello world");
  }
});

exec.shutdown();

Пример может быть тривиальным, но попытайтесь считать, что строка «hello world» состоит из и вы хотите, чтобы эта операция выполнялась в нескольких потоках за раз, чтобы улучшить производительность вашей программы. Это всего лишь один пример. Есть еще много случаев, когда вы планируете или запускаете несколько потоков и используете ExecutorService в качестве менеджера потоков.

Для запуска одного потока я не вижу явного преимущества используя ExecutorService.

18
ответ дан Manny 17 August 2018 в 15:52
поделиться
  • 1
    Разве это не exec.execute (новый Runnable () ..? – devnull 21 October 2010 в 04:42
  • 2
    Либо все в порядке, поскольку Thread реализует Runnable. Для простых случаев Runnable должен быть адекватным. – Manny 21 October 2010 в 04:56
  • 3
    Я действительно не думаю, что есть смысл создавать Thread, когда все, что вам нужно, это Runnable ... вы даже не запускаете Thread, поэтому он только добавляет путаницу и ненужный багаж. – ColinD 21 October 2010 в 05:00
  • 4
    ayt, прикладной комментарий к обзору. :) – Manny 21 October 2010 в 06:37
  • 5
    Всегда полезно делать exec.shutdown(); в заявлении finally с нулевой проверкой. – Aniket Thakur 28 January 2017 в 21:33

Ниже приведены некоторые преимущества:

  1. Служба администратора управляет потоком асинхронным способом
  2. Используйте метод callable для получения результата возврата после завершения потока.
  3. Управление распределением работы для бесплатного потока и перепродажа завершенной работы из потока для назначения новой работы автоматически
  4. fork - структура объединения для параллельной обработки
  5. Улучшенная связь между потоками
  6. invokeAll и invokeAny дают больше возможностей для запуска любого или всего потока сразу.
  7. shutdown предоставляет возможность для завершения всей работы, связанной с потоком
  8. . Службы Scheduled Executor предоставляют методы для создания повторяющихся вызовов runnables и Называем, что это вам поможет
8
ответ дан Nitin 17 August 2018 в 15:52
поделиться
  • 1
    Разве это не «Будущее»? во втором месте вместо Callable? Будущее - это то, откуда мы можем получить результат / значение после завершения потока. – AmitG 4 May 2017 в 04:58
  • 2
    Да, например, например. Будущее & л; Строка & GT; future = executorService.submit (вызываемый); – Vinit Mehta 2 March 2018 в 19:01

Следующие ограничения от традиционной Thread, преодолеваемые инфраструктурой Executor (встроенная структура пула потоков).

  • Плохое управление ресурсами, то есть он продолжает создавать новый ресурс для каждого запроса. Нет ограничений на создание ресурса. Используя инфраструктуру Executor, мы можем повторно использовать существующие ресурсы и установить ограничение на создание ресурсов.
  • Не настойчиво: если мы продолжим создавать новый поток, мы получим исключение StackOverflowException, поэтому наша JVM сработает.
  • Накладные расходы Создание времени: для каждого запроса нам нужно создать новый ресурс. Для создания нового ресурса требуется много времени. т. е. создание темы> задача. Используя инфраструктуру Executor, мы можем построить в пуле потоков.

Преимущества пула потоков

  • Использование пула потоков уменьшает время отклика, избегая создания потока во время запроса или обработки задачи.
  • Использовать пула потоков позволяет вам изменить свою политику выполнения по мере необходимости. вы можете перейти от одного потока к нескольким потокам, просто заменив реализацию ExecutorService.
  • Пул потоков в приложении Java повышает стабильность системы, создавая настроенное количество потоков, основанное на загрузке системы и доступном ресурсе.
  • Пул потоков освобождает разработчика приложений от управления потоками и позволяет сосредоточиться на бизнес-логике.

Источник

7
ответ дан Premraj 17 August 2018 в 15:52
поделиться
Другие вопросы по тегам:

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