- PR -

finalizeメソッドについて

1
投稿者投稿内容
uhou
会議室デビュー日: 2005/03/23
投稿数: 6
投稿日時: 2005-03-25 07:15
はじめまして、uhouといいます。
ログクラスを自作で作ろうとしています。
ログクラスのコンストラクタでファイルを開き、アプリケーション終了時にファイルを閉じようとfinalize()を使いましたが、アプリケーション終了時にどうもfinalizeが呼ばれいてません。また、System.runFinalizersOnExit( true );を使えばfinalizeが呼ばれるのですが推奨されていません。どうすればよろしいのでしょうか。
以下はソースです。
public class HelloWorld
{
public static void main( String[] args )
{
System.runFinalizersOnExit( true );
Log log = new Log();
log.write( "log write test." );
}
}

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Log
{
private Writer _writer;

public Log()
{
try{
File file = new File( "TestLog.log" );
_writer = new FileWriter( file );
}catch( Exception e ){
e.printStackTrace();
}
}

public void write( String strMsg )
{
try{
_writer.write( strMsg );
_writer.flush();
}catch( Exception e ){
e.printStackTrace();
}
}

protected void finalize()
{
System.out.println( "finalize ok" );
try{
_writer.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-25 09:03
Runtime#addShutdownHookを使ってみては如何ですか?
自作ログクラスのコンストラクタで自分自身のfinalizeを呼び出すThreadを作成し、
Runtime#addShutdownHookを使用しそのThreadを登録してみてください。
uhou
会議室デビュー日: 2005/03/23
投稿数: 6
投稿日時: 2005-03-25 12:38
かつのりさん返信ありがとうございます。
早速やってみました。
run()が自動で呼ばれてclose()ができてるみたいです。
finalize()は、相変わらず呼ばれません。これは、使われない物なのでしょうか。
以下がソースです。
public class HelloWorld
{
public static void main( String[] args )
{
Log log = new Log();
log.write( "log write test." );
}
}

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Log extends Thread
{
private Writer _writer;

public Log()
{
try{
File file = new File( "TestLog.log" );
_writer = new FileWriter( file );
Runtime.getRuntime().addShutdownHook( this );
}catch( Exception e ){
e.printStackTrace();
}
}

public void write( String strMsg )
{
try{
_writer.write( strMsg );
_writer.flush();
}catch( Exception e ){
e.printStackTrace();
}
}

protected void finalize()
{
System.out.println( "finalize ok" );
try{
_writer.close();
}catch( Exception e ){
e.printStackTrace();
}
}

public void run()
{
System.out.println( "run ok" );
try{
_writer.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}

以下は、実行結果です。
run ok
かしん
常連さん
会議室デビュー日: 2004/08/27
投稿数: 25
お住まい・勤務地: 窓際
投稿日時: 2005-03-25 12:50
引用:

finalize()は、相変わらず呼ばれません。これは、使われない物なのでしょうか。



API仕様書には
『このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。サブクラスは finalize メソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを行うことができます。』
と書いてあるので、GCが、このオブジェクトへの参照はまだ必要だと思っているから呼び出されないのでしょう。
詳細は、API仕様書を確認してください。
java.lang.Object#finalize
uhou
会議室デビュー日: 2005/03/23
投稿数: 6
投稿日時: 2005-03-29 07:01
かしんさん遅れましたが、返信ありがとうございます。
finalizeは参照を意識しながら作らないといけないみたいなので、かつのりさんが教えてくれたaddShutdownHookを使って作ろうと思います。
みなさん、ご教授ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)