Вызвать нестатический метод из ShutdownHook - PullRequest
1 голос
/ 31 августа 2011

Мне нужно вызвать метод нестатическим методом removeLocksOnExit() из ShutdownHook.метод объявлен в том же классе, где основной.

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

//final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // remove lock file...
        removeLocksOnExit();
    }
});

RemoveLocks () не может быть объявлен статическим, и поэтому я не могу вызватьэто прямо из нового потока.

Основной класс содержит, однако, закрывающие окна действия, которые также вызывают метод.Вот выдержка из кода:

addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        if (exit() == 0) {
            removeLocksOnExit();
            log.info("END");

            System.exit(0);
        }
    }
});

Возможно, я мог бы тогда из addShutdownHook запустить событие закрытия окон.и эта вызовет функцию для меня.(Или создайте специальное событие для цели кэширования ...

Возможно ли это? Если да, как бы вы запустили событие ??

, чтобы лучше понять этоСтруктура моего класса:

public class MyTool extends JFrame{

removeLocksOnExit(){
....
...
}

 public static void main(String[] args) {
...............
.........
    //final Thread mainThread = Thread.currentThread();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            // remove lock file...
            removeLocksOnExit();
        }
    });
}

final MyTool inst = new MyTool(args);

MyTool(String[] args) {
        super(CustomPathModel.MyTITLE);
        setResizable(false); // FIXME find a way to auto size inner xml-editor
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                if (exit() == 0) {
                    removeLocksOnExit();
                    log.info("END");

                    System.exit(0);
                }
            }
        });

        setLookFeel();
        initAdminStatus();
        initGUI();
        addToolActionListener(this);
    }
}

Ответы [ 3 ]

1 голос
/ 31 августа 2011

Когда вы создаете экземпляр основного класса, вы можете использовать этот объект для вызова removeLocksOnExit ()

    final MainClass object = new MainClass();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            // remove lock file...
            object.removeLocksOnExit();
        }
    });

Или добавить ShutdownHook в нестатический метод.

1 голос
/ 31 августа 2011

Вы добавляете событие закрытия окна в конструктор. Также добавьте туда отключающий крюк.

Остерегайтесь , однако, что метод removeLocks может вызываться дважды из разных потоков. Позаботьтесь о том, чтобы он убирался после себя и был безопасен. Также убедитесь, что метод removeLocks готов к запуску (т. Е. Все переменные, которые ему нужны, были инициализированы) до , когда вы создаете прослушиватель окна или перехватчик завершения работы.

0 голосов
/ 31 августа 2011

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

class SomeClass {
    void someMethod() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
               // remove lock file...
               SomeClass.this.removeLocksOnExit();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...