我的继承人螺纹:如何在应用程序退出/类别销毁时停止线程?
class A
{
private class MeshBuilder implements Runnable
{
private volatile boolean looping = true;
public void run()
{
Logger.getGlobal().log(Level.OFF, "starting new thread");
while(looping)
{
}
Logger.getGlobal().log(Level.OFF, "closing thread");
}
public void endLoop()
{
looping = false;
}
}
}
我曾尝试重写主类的finalize函数,但是过程中也保持在内存中。 (我认为垃圾收集器调用原来敲定的,不是我)
class A
{
...
@Override
protected void finalize() throws Throwable
{
meshBuilder.endLoop();
super.finalize();
}
...
}
如果我想那个线程结束(调用endLooping)时,主机类(A)死亡或者当应用程序执行完毕后,我该怎么办呢?
@Brett OKKEN
我已经加入:
private class MeshBuilderShutdownHook implements Runnable
{
MeshBuilder meshBuilder;
public MeshBuilderShutdownHook(MeshBuilder meshBuilder)
{
this.meshBuilder = meshBuilder;
}
public void run()
{
Logger.getGlobal().log(Level.OFF, "MeshBuilderShutdownHook");
meshBuilder.endLoop();
}
}
而且在类的构造函数,我有:
meshBuilder = new MeshBuilder();
meshThread = new Thread(meshBuilder);
meshThread.start();
MeshBuilderShutdownHook shutdownHook = new MeshBuilderShutdownHook(meshBuilder);
Thread shutdownThread = new Thread(shutdownHook);
Runtime.getRuntime().addShutdownHook(shutdownThread);
当我闭上我的应用,线程仍在运行。
/\ adding meshThread.setDaemon(true);解决它
不适用'finalize'。 GC在某些时候会调用它。可能永远不会。 –