我需要从ShutdownHook中将该方法称为非静态方法removeLocksOnExit()。该方法在main所在的同一个类中声明。
大体上,我有以下代码:
//final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// remove lock file...
removeLocksOnExit();
}
});removeLocks()不能是静态的,因此我不能直接从新线程中调用它。
不过,main类包含了一个动作监听器,它会在关闭窗口时调用该方法。以下是代码的摘录:
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);
}
}发布于 2011-08-31 20:20:50
您可以在构造函数中添加窗口关闭事件。在那里也添加关闭钩子。
但是要注意,removeLocks方法可能会从不同的线程被调用两次。注意,它会自动清理,并且是threadsafe。在创建窗口侦听器或关闭钩子之前,还要确保removeLocks方法已准备好运行(即,它所需的所有变量都已初始化)。
发布于 2011-08-31 20:11:06
创建主类的实例时,可以使用该对象调用removeLocksOnExit()
final MainClass object = new MainClass();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// remove lock file...
object.removeLocksOnExit();
}
});或者,您可以在非静态方法中添加ShutdownHook。
发布于 2011-08-31 20:08:10
只需使用对添加关闭钩子的对象的引用。我做了一个假设,没有竞争条件。如果有,则添加您需要的任何代码以使其线程安全。
class SomeClass {
void someMethod() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// remove lock file...
SomeClass.this.removeLocksOnExit();
}
});
}
}https://stackoverflow.com/questions/7256620
复制相似问题