Поток по сравнению с ThreadPool

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

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

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

133
задан Machavity 5 November 2018 в 20:11
поделиться

7 ответов

Пул потоков предоставит преимущества для частых и относительно коротких операций

  • потоки Многократного использования, которые были уже созданы вместо того, чтобы создать новые (дорогой процесс)
  • Регулировка уровня создания потока, когда существует пакет запросов на новые объекты работы (я полагаю, что это находится только в.NET 3.5)

    • при организации очередей 100 задач пула потоков это будет только использовать столько потоков, сколько были уже созданы для обслуживания этих запросов (скажите 10, например). Пул потоков осуществит частые проверки (я верю каждым 500 мс в 3,5 SP1), и если будут поставленные в очередь задачи, то он сделает один новый поток. Если Ваши задачи будут быстры, то количество новых потоков будет небольшим и снова использует, приблизительно 10 потоков для коротких задач будут быстрее, чем создание 100 потоков впереди.

    • , Если Ваша рабочая нагрузка последовательно имеет большие количества пула потоков, запрашивает вхождение, то пул потоков настроит себя на Вашу рабочую нагрузку путем создания большего количества потоков в пуле вышеупомянутым процессом так, чтобы было большее число потока, доступного для обработки запросов

    • проверка Здесь для больше подробно информации о том, как функции пула потоков под капотом

Создание нового потока самостоятельно было бы более соответствующим, если бы задание было относительно длительным (вероятно, приблизительно секунда или два, но это зависит от определенной ситуации)

@Krzysztof - потоки Пула потоков являются фоновыми потоками, которые остановятся, когда основной поток закончится. Вручную созданные потоки являются передним планом по умолчанию (будет продолжать бегать за основным потоком, закончился), но может быть установлен на фон, прежде чем вызов Запустится на них.

107
ответ дан 24 November 2019 в 00:03
поделиться

.NET управляла пулом потоков: -

  • Размеры самостоятельно на основе текущей рабочей нагрузки и доступных аппаратных средств
  • Содержат рабочие потоки и потоки порта завершения (которые конкретно привыкли к сервису IO)
  • , оптимизирован для большого количества относительно недолгих операций

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

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

Так, если Вы создадите маленькое, ограниченное количество потоков, создают их сами. Если Вы не можете определить заранее, сколько потоков могло бы быть создано (например, они создаются в ответ на поступление IO), и их работа будет недолгой, использовать пул потоков. Если Вы не знаете, сколько, но их работа будет продолжительно, нет ничего в платформе для помощи Вам - но Вы смогли находить альтернативные реализации пула потоков тем соответствием.

14
ответ дан 24 November 2019 в 00:03
поделиться

также

new Thread().Start()

поток Переднего плана икры, который не умрет, если Вы закроете свою программу. Потоки ThreadPool являются фоновыми потоками, которые умирают, когда Вы закрываете приложение.

9
ответ дан 24 November 2019 в 00:03
поделиться

Проверьте здесь на более ранний поток:

, Когда я не должен использовать ThreadPool в .NET?

Сводка - то, что Пул потоков хорош, если необходимо породить много недолгих потоков, тогда как использование Потоков дает Вам немного больше контроля.

3
ответ дан 24 November 2019 в 00:03
поделиться

Локальная память потока не является хорошей идеей с пулами потоков. Это дает потокам "идентификационные данные"; не все потоки больше равны. Теперь пулы потоков особенно полезны, если Вам просто нужен набор идентичных потоков, готовых сделать Вашу работу без создания наверху.

1
ответ дан 24 November 2019 в 00:03
поделиться

При необходимости в большом количестве потоков Вы, вероятно, хотите использовать ThreadPool. Они снова используют потоки, сохраняющие Вас издержки создания потока.

, Если Вам просто нужен один поток, чтобы сделать что-то, Поток является, вероятно, самым легким.

1
ответ дан 24 November 2019 в 00:03
поделиться

В целом (я никогда не использовал.NET), пул потоков использовался бы в целях управления ресурсами. Это позволяет ограничениям быть настроенными в Ваше программное обеспечение. Это также может быть сделано по причинам производительности, поскольку создание новых потоков может быть дорогостоящим.

может также быть система определенные причины. В Java (снова я не знаю, относится ли это к.NET), менеджер потоков может применить поток определенные переменные, поскольку каждый поток вытягивают от пула и сбросил их, когда они возвращаются (распространенный способ передать что-то как идентификационные данные).

ограничение В качестве примера: у Меня только есть соединения на 10 дб, таким образом, я только позволил бы 10 рабочих потоков для доступа к базе данных.

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

0
ответ дан 24 November 2019 в 00:03
поделиться
Другие вопросы по тегам:

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