我的繼承人螺紋:如何在應用程序退出/類別銷燬時停止線程?
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在某些時候會調用它。可能永遠不會。 –