2015-04-25 6 views
3

Я хочу знать, закрывается ли поток в java, когда заканчивается метод запуска.Нитки заканчиваются при завершении работы?

Я имею в виду, у меня есть новое объявление нить:

new Thread(new SubmitDataOnBackground(handler.getIDValue(), data, this.context)).start(); 

И затем, в SubmitDataOnBackground у меня есть этот метод запуска:

public void run() { 
    SubmitDataHandler submit = new SubmitDataHandler(ID, data, this.context); 
    submit.buildAndSubmitData(); 

} 

После завершения buildandSubmitData, делает нить закрыть себя или I нужно где-нибудь добавить какой-нибудь код?

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

Мое приложение - это сервер, поэтому он никогда не закончится, потому что он активен все время. Я просто хочу знать, что количество потоков не превышает число, потому что оно просто создает новые, не закрывая остальных при завершении.

+0

Темы прекращается после завершения. Вам не нужно вручную заканчивать/убивать их. – Taplar

+0

Не дубликат этого вопроса. –

ответ

5

Темы закрываются после вызова метода run. Прочтите это для дополнительной информации https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

EDIT: Если вы хотите этого избежать, я рекомендую использовать ThreadPools.

+0

Хорошо, я рад это знать. Я хочу, чтобы они закрылись, так что это поведение, в котором я нуждаюсь. Во всяком случае, я прочитаю вашу ссылку, чтобы узнать немного больше – Biribu

+0

@Biribu, если вы хотите многократно вызывать метод run, рекомендуется использовать ThreadPools, потому что они сохраняют свои потоки, когда метод запуска завершен. Возможно, вы захотите заглянуть в это, если вы его много назовете. – Distjubo

+0

Хорошо, я буду помнить об этом, и я попытаюсь его реализовать. Я использую поток, чтобы сохранить некоторые данные в моей базе данных, данные попадают на сервер 3 или 4 раза в минуту, поэтому, может быть, это хорошая идея threadpool – Biribu

2

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

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

1

Нити прекращаются после окончания работы (когда завершается выполнение run()). Если вы хотите проверить, используйте isAlive().

+0

Да ... но что означает «после окончания работы»? ОП спросил о методе 'run()'. –

+0

Я думаю о методе запуска в качестве работы Thread - что еще это может быть? :) – farukdgn

+0

Что вы «думаете» не в этом. Цель SO-ответа - объяснить OP в терминах, которые он или она может понять. Если он спрашивает о методе 'run()', объясните его ему в терминах метода 'run()'. –

0

Для того, чтобы фактически сделать остановку потока, процесс довольно прост. Все, что вам нужно сделать, это просто запустить метод run и вернуться.

public void run(){ 

    // implement your code 

    // Just about to return and the Thread will then stop soon after 

} 

Примечание что нить не обязательно будет объявлена ​​закончена сразу же после метода запуска закончил, как Java Virtual Machine (JVM) еще нужно закончить его в фоновом режиме, но она должна полностью прекратится вскоре.

Другими словами, когда создается нормальная нить (также называемая пользовательской нитью), ожидается, что она завершит свою работу, а не полностью отключится. JVM не прекращается до тех пор, пока все пользовательские потоки не закончатся, или пока не будет сделан вызов к методу System.exit(), который неожиданно завершает работу JVM.

EDIT:System.exit() не останавливает JVM внезапно, он сначала выполняет все выключения. Runtime.getRuntime().halt() останавливает JVM без дальнейшей обработки.

+0

Вопрос не в том, как остановить поток. –

+1

Я думаю, что мы не должны использовать stop(), поскольку он устарел. – farukdgn

+0

Методы 'destroy' и' stop' были устаревшими в Java 1.1. Вы не найдете никакого * нормального * кода, использующего их. Поэтому на самом деле их не стоит упоминать. Кроме того, это не тот вопрос, о котором идет речь. –

0

Да, потоки прекращаются после завершения заданий (последовательность инструкций) в методе run(). Однако объект потока, который был создан, все еще существует, что позволяет снова вызвать его с помощью Thread.start(), чтобы создать новую тему.

Если вы хотите быть уверенным, что ваш метод запуска потока заканчивается, прежде чем продолжать делать что-то еще, попробуйте использовать метод Thread.join() в том же месте, где вы работаете с потоками.

Прочитайте это для получения дополнительной информации о том, что:
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join%28%29

Смежные вопросы