Java, как убить процесс на объекте уничтожить - PullRequest
2 голосов
/ 28 марта 2012

Предположим, у меня есть объект "A", который запускает некоторый процесс в своем конструкторе. Мне нужно вызвать метод очистки, как только объект освобожден (установлен в ноль или вышел из своей жизненной области).

Проблема в том, что в java нет деструкторов, и поэтому не гарантируется, что так называемый метод "финализации" будет запущен сразу после того, как объект установлен в ноль или выходит из области видимости. Только тогда, когда GC считает, что «пришло время».

Также я не могу использовать ловушку завершения работы, так как мой код работает на сервере Java EE и не является простым приложением Java SE, которое запускается и завершается одновременно. Что можно сделать в такой ситуации?

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Вы не должны создавать свой собственный поток в контейнере Java EE, и НИКОГДА не пытаться уничтожить их, поскольку это устарело и приведет к разрушению вашей виртуальной машины / контейнера Java EE.

Посмотрите на CommonJ JSR 237, который позволяет создавать фоновые рабочие в контейнере Java EE: http://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html

Вы можете контролировать запуск и завершение работы приложения Java EE с помощью ServletContextListener: http://www.roseindia.net/servlets/ServletContextListener-example.shtml.

1 голос
/ 28 марта 2012

Это просто невозможно с помощью Java.

finalize вызывается всякий раз, когда GC хочет удалить объект, но нет, когда программа завершает работу (что не должно происходить в приложении Java EE).

Так что единственный способ - сделать это самостоятельно. Например, вы можете использовать ObjectPool, где все экземпляры объекта A хранятся в списке (с дополнительной отметкой времени, если требуется). Когда приходит время (например, запускается по специальному URL с помощью wget & cron), вы просто перебираете этот список и уничтожаете каждый ненужный объект.

Это только один (очень простой) возможный способ.

...