Обеспечение "чистого" завершения
Чтобы обеспечить "чистое" завершение, уничтожение не должно разрушать ни какие разделяемые ресурсы до тех пор, пока не завершатся все сервис-процессы. Один момент реализации этого, проверка счетчика выполняемых сервисов. Другой - заключается в оповещении "долгоиграющего" методов, что пора завершать работу. Это выполняет другая часть кода приведенная ниже. Например:
public ShutdownExample extends HttpServlet { private boolean shuttingDown; ... //Методы доступа к процессам завершения
protected void setShuttingDown(boolean flag) { shuttingDown = flag; } protected boolean isShuttingDown() { return shuttingDown; } }
Ниже приведен пример метода destroy использующего вышеуказанные методы для обеспечения "чистого" завершения:
public void destroy() {
synchronized(lock) { /* Проверка на наличие ваполняемых сервисов, * и если таковые существуют, останавливаем их. */
if (numServices() > 0) { setShuttingDown(true); }
/* Ждем завершения всех сервисов. */
while(numServices() > 0) { try { wait(); } catch (InterruptedException e) { } } } }