Как узнать, когда поток останавливается или останавливается?
У меня есть следующий код:
Executor exe = Executors.newFixedThreadPool(20);
while (true) {
try {
exe.execute(new DispatcherThread(serverSocket.accept()));
continue;
} catch (SocketException sExcp) {
System.exit(-1);
} catch (Exception excp) {
System.exit(-1);
}
}
Для каждого DispatcherThread
Я создаю соединение с базой данных (это означает, что у меня есть 20 соединений), мне нужно знать, как я могу закрыть соединение с базой данных, когда поток остановлен, или он останавливает или завершает свой поток.
2 ответа
Вы не можете непосредственно знать, когда поток остановлен, самое близкое, что у вас есть Thread#isAlive
метод, но он может вернуться false
когда run
метод в потоке завершен, но поток не может быть остановлен, поскольку JVM не может этого гарантировать. Но если ваш DispatcherThread
реализует класс Runnable
интерфейс, то вы можете написать очистку в нижней части run
метод.
Скелетный код:
class DispatcherThread implements Runnable {
@Override
public void run() {
try {
//open database connection an such...
//...
//handle the work here...
} catch (...) {
//ALWAYS handle the exceptions
} finally {
//cleanup tasks like close database connection
}
}
}
Кстати, суффикс потока не является хорошим именем для класса, который технически не является потоком (потому что он не расширяется от Thread
). Вместо этого дайте правильное имя в соответствии с тем, что следует делать.
Вы можете закрыть специфичное для потока соединение в конце вашего run()
метод.
finally
Блок гарантирует, что это произошло, однако метод run() завершился.
class DispatcherThread extends Runnable {
public void run() {
...
try {
...
}
finally {
// Close the connection
}
}