2016-07-20 3 views
-2

Вот этот метод, который я имею в виду, и задаюсь вопросом, могу ли я вызвать submit, не используя метод get в будущем для получения результата, будет ли утечка потока (я имею в виду поток в пуле потоков никогда не сможете повторно использоваться повторно, так как его результат не извлекается), что повлияет на производительность всего пула потоков в будущем? Благодарю.submit of Confusion в Java

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#submit-java.util.concurrent.Callable-

С уважением, Лин

+1

_I означает, что поток в пуле потоков никогда не сможет повторно использоваться, так как его результат не получен. Вы можете описать поведение, о котором вы здесь думаете? –

+1

Это то, что вы можете легко проверить: создать фиксированный пул потоков, отправить больше запросов, чем количество потоков, и посмотреть, что произойдет. –

+0

@SotiriosDelimanolis, спасибо за ответ и проголосуйте. Я полагаю, если пул потоков имеет размер 5, если я отправляю 5 потоков, не получая результат, могу ли я представить 6-й поток? Это вопрос. –

ответ

2

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

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

IF вот как он будет реализован, и если код также забыл о Future, то Future и результат, как будут собраны с помощью GC, и это будет конец.

Это реализация, которая имела бы смысл для меня. Вы можете видеть сами, как ThreadPoolExecutor класс в проекте OpenJDK на самом деле делает это путем анализа исходного кода:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent

Я взял быстрый быстрый взгляд, но у меня нет времени, чтобы изучить его углубленных ,

Как я сказал в своем комментарии (выше), я бы написал тест и узнал сам, если бы у меня возникли сомнения.

+0

Спасибо Джеймс, проголосуйте за ответ. Хотите узнать, влияет ли производительность памяти? то есть, если я не получаю результат, память будет больше и больше и может вызвать GC, правильно? –

+1

@LinMa, игнорируя результат, который был возвращен вашей задачей, не увеличит использование памяти. Память была выделена, когда ваша задача создала объект, и она будет восстановлена ​​GC вскоре после того, как объект станет «недоступным». (т. е. когда в программе нет переменных, которые ссылаются на него.) –

+0

Спасибо Джеймсу, проголосуйте и отметьте свой ответ в качестве ответа. Цените на терпение, чтобы объяснить мне. –