Как узнать, когда поток останавливается или останавливается?

У меня есть следующий код:

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
       }
    }
Другие вопросы по тегам