Какая-то ветка умерла, так что это стало вопросом интервью

Java

Некоторые потоки живы, но лежат в пуле и ничего не делают;
Некоторые темы умерли, так что это стало вопросом интервью.

Эта статья начинается с интервью с Alibaba.

Помню, был понедельник, и я только что испытал расслабление выходных, был полон сил и лихорадочно печатал на клавиатуре. В это время у меня зазвонил мобильный телефон, я снял трубку и увидел, что звонят из Ханчжоу. Я подумал, порекомендую ли я акции или возьму кредит на этот раз. Я взяла трубку, готовая дразнить. Там раздался голос: «Привет, это ххх? Это Ханчжоу Алибаба. У тебя сейчас есть время на телефонное интервью?». Честно говоря, выслушав эту фразу, я чувствую, что я уже в Ханчжоу, и я полон сил, чтобы «починить благословение» на рабочем месте Али в Ханчжоу. Но я сейчас занимаюсь сумасшедшим выходом, и у меня нет времени, поэтому я сказал: «Извините, у меня сейчас нет времени, могу я назначить встречу на 8 часов вечера сегодня?».

Вчера вечером получил телефонный звонок. Мы сразу перешли к теме, и между вами и мной состоялся дружеский технический обмен мнениями. Конкретный процесс интервью не будет подробно описан, и будет возможность организовать интервью, чтобы поделиться им позже. На протяжении всего собеседования меня мучил один вопрос:

Поток в пуле потоков является ненормальным, как пул потоков будет обрабатывать этот поток?

Следует отметить, что все пулы потоков, обсуждаемые в этой статье, являются пулами потоков Executors.

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

Знаете о пуле потоков JDK Executors?
Знаете ли вы, какие реализации по умолчанию предоставляются JDK?
Вы читали руководство по разработке Java для Alibaba? Любая идея, почему реализация по умолчанию не разрешена?
Вы не используете стандартные, верно? Позвольте мне представить некоторые общие параметры вашего пользовательского пула потоков?
Как вы получили значения этих параметров? Рассчитано? Как вы это поняли?
Являются ли задачи в пуле потоков интенсивными операциями ввода-вывода или вычислительными ресурсами?
Хорошо, теперь у нас есть собственный пул потоков, давайте поговорим о рабочем процессе вашего пула потоков?
Итак, что вы делаете, когда ваш пул потоков заполнен? Мусор? Зачем отказываться? Какова политика отказа?
Не нервничай, просто скажи два.
......
Возвращаясь к руководству по разработке Java для Alibaba, которое не позволяло использовать реализацию по умолчанию, вы ответили, что это может вызвать OOM, тогда давайте поговорим о JVM.
......

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

Это действительно важно, и я много раз подчеркивал это своим друзьям:

Давай вместе анализировать волну

Ну, а теперь вернемся к интервьюеру Али, который задал мне этот вопрос:

Поток в пуле потоков является ненормальным, как пул потоков будет обрабатывать этот поток?

Позвольте мне рассказать о моем ответе в то время, потому что я понятия не имею, мой ответ был нерешительным и плохим! следующее:

Мой ответ можно свести к трем предложениям:

1. Выбросить исключение стека --- Это предложение наполовину верно!
2. Не влияет на другие задачи потока --- с этим предложением все в порядке!
3. Этот поток будет возвращен в пул потоков --- все это предложение неверно!

писать тест-кейсы

Почему создание исключения стека наполовину правильно?

Пусть сначала запустится программа, давайте говорить фактами:

По результатам выполнения мы видим, что

Когда режим выполнения выполнен, вы можете увидеть вывод исключения стека.

Когда режим выполнения является отправкой, исключение стека не выводится.

Итак, как нам получить стековое исключение метода выполнения submit, смотрим на картинку и говорим:

Итак, теперь вы знаете, почему ответ: выбрасывать исключение стека — правильно только наполовину.

Когда выполняется метод execute, генерируется (распечатывается) исключение стека.

Когда метод отправки выполняется, возвращаемый результат инкапсулируется в будущем.Если вызывается метод future.get(), исключение должно быть перехвачено, чтобы можно было выдать (распечатать) исключение стека.

Как вы думаете, эта часть закончена здесь? Это не сработает, разве у тебя нет вопроса? Почему execute вызывает исключение напрямую, а submit не вызывает исключение напрямую? Под исходным кодом секретов нет:

Когда метод выполнения выполняется:

существуетjava.util.concurrent.ThreadPoolExecutor#runWorkerБыло выброшено исключение:

существуетjava.lang.ThreadGroup#uncaughtExceptionОбработка исключений выполняется:

Кто это uncaughtException, посмотрите, что говорится в java-документе:

Этот метод вызывается JVM, нам просто нужно указать, как мы хотим с этим справиться.

Итак, как мы указываем:

Когда метод выполнения отправляется:

Суть его в том, чтобы вызвать метод execute, поэтому он все равно возвращаетjava.util.concurrent.ThreadPoolExecutor#runWorkerметод:

Двигаясь вперед, продолжайте отслеживать, чтобы увидеть:

java.util.concurrent.FutureTask#setExceptionЧто ты делаешь, посмотри:

Сделайте глубокий вдох, организуйте свои мысли, и мы на пути к истине в последней инстанции:

Хорошо, первая тема **[Почему выбрасывать исключения стека наполовину правильно?]** Обсуждение окончено. После прогулки по исходному коду теперь мы можем дать полный ответ на эту часть.

Не влияет на другие задачи ветки, правильный ответ

В этой части давайте перейдем непосредственно к коду и запустим его, чтобы увидеть результат:

Код и результаты выполнения не обманывают:

После того, как поток в пуле потоков вышел из строя, он не влияет на другие задачи потока.

Все обращайте внимание на детали названия темы: 1, 2, 3, 4, 6. Дьявол кроется в деталях, об этом я расскажу ниже, а сначала задам вопрос здесь:Мне просто интересно, почему нет 5?!

Почему неправильно то, что этот поток будет возвращен в пул потоков?

Давайте перейдем к исходному коду, чтобы найти ответ:

Пусть исходный код даст ответ:

Куда делся 5 поток?

Новый метод Worker() сообщит вам, куда ушло: 5.

Вкупе с этой картиной, нарисованной мной, моим художником души, и вместе съеденной, получается еще вкуснее:

Теперь мы знаем, почему: мой ответ на вопрос, почему этот поток будет возвращен в пул потоков, совершенно неверен.Это также дает вам подробную информацию об изменении названия темы, пожалуйста, просто обратите внимание.

в заключении

Когда поток в пуле потоков ненормальный:

1. Когда метод выполнения выполнен, вы можете увидеть вывод исключения стека.

2. В режиме выполнения submit исключение стека не имеет вывода. Но при вызове метода Future.get() исключение может быть перехвачено.

3. Это не повлияет на нормальное выполнение других потоков в пуле потоков.

4. Пул потоков удалит поток и создаст новый поток в пуле потоков.

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

Выше было высказано мое мнение по вопросу "Поток в пуле потоков является ненормальным, как пул потоков будет обрабатывать этот поток?" Это только мое личное мнение. Друзья с разными мнениями приветствуются для обсуждения и продвижения вперед вместе. .

Последнее слово

Эта статья была задумана и подготовлена ​​после того, как я закончил предыдущую статью в прошлую пятницу. Большая часть контента обдумывается примерно за полчаса до сна ночью и пишется примерно за час рано утром в выходные и будни.

На самом деле нетрудно придумать, что писать, но сложно контролировать содержание. Что касается технического языка, я неоднократно изучал и консультировался с большим количеством статей для проверки и фальсификации. Короче говоря, будьте осторожны со своими словами. В конце концов, я думаю, что заниматься технологиями - это очень строгое дело. Я часто представляю, что я ремонт культурных реликвий в Запретном городе Ремесленники, с точки зрения познания духа ремесленника, я, может быть, немного отстаю от них в настоящее время, но я часто требую от себя духа мастерства. Как я выразился в группе: Для технических статей я стараюсь обеспечивать еженедельные толчки и делаю все возможное для обеспечения качества.

Наконец, еще один вздох:

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

Потому что он умирает на пути к своей миссии,
С его последним криком
«Ради нового брата уберите меня!»
Наконец, это становится вопросом интервью.

Я еще не ответил.

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