- PR -

propertiesファイルの再読込

1
投稿者投稿内容
Samiadon
会議室デビュー日: 2003/10/08
投稿数: 16
お住まい・勤務地: 東京都神戸市浪速区猿猴橋町三条下ル
投稿日時: 2003-10-08 18:01
一定時間が経過する毎に処理を繰り返すスレッドを作成し、
プロパティファイルに書かれたフラグを変更すると処理を停止するように
したいと思い、以下のような文を書いたのですが、最初に読み込んだ値を
リフレッシュしてくれません。
最新のデータを常に読み出すようにするにはどうすればよいか
ご教示をお願い致します。

private ResourceBundle rb;
volatile Thread thread = null;

public aaa {

public void run() {
Thread thisThread = Thread.currentThread();
while (thread == thisThread) {
..

thread = end();
}
}

public Thread end() {
rb = ResourceBundle.getBundle("propertiesFileName");
String flag = rb.getString("ENDFLAG")
if (flag.equals("END")) thread = null;

...

return thread;
}

ResourceBundleをEnd()のプライベートで宣言してみたりしましたが、
最初に読み出した値をそのまま保持してしまっているようです。
リフレッシュの方法などがあれば良いと思ったのですが、的外れな
ことをしているようでしたら、是非ともご指摘をお願い致します。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2003-10-08 18:51
汚いですがこんなやり方でどうでしょうか。

コード:

import java.io.*;
import java.util.*;

public class PropertiesReloader implements Runnable
{

public static void main(String[] args)
{

PropertiesReloader pr = new PropertiesReloader();
pr.run();

}

public void run()
{
ClassLoader loader
= Thread.currentThread().getContextClassLoader() ;
PropertyResourceBundle prb;

while (true) {

try {
Thread.sleep(1000l);

prb = new PropertyResourceBundle
(loader.getResourceAsStream("hoge.properties"));
System.out.println("value = " + prb.getString("value"));

} catch (Exception e) {
return;
}
}
}

}



・・・あんまり汚かったんで少し直しました。

[ メッセージ編集済み 編集者: でくのぼう 編集日時 2003-10-08 18:57 ]

[ メッセージ編集済み 編集者: でくのぼう 編集日時 2003-10-08 19:04 ]
Samiadon
会議室デビュー日: 2003/10/08
投稿数: 16
お住まい・勤務地: 東京都神戸市浪速区猿猴橋町三条下ル
投稿日時: 2003-10-08 19:59
早速のご教示ありがとうございます!

御例示頂いたものを参考にして修正しましたところ、
意図した通りにスレッドを停止させることができました。

getResourceAsStreamは使用したことがありませんでしたので
とても勉強になりました。

本当にありがとうございました。
nori1122
常連さん
会議室デビュー日: 2003/09/14
投稿数: 30
投稿日時: 2003-10-09 10:41
引用:

でくのぼうさんの書き込み (2003-10-08 18:51) より:
汚いですがこんなやり方でどうでしょうか。

コード:
import java.io.*;
import java.util.*;

public class PropertiesReloader implements Runnable
{

    public static void main(String[] args)
    {

        PropertiesReloader pr = new PropertiesReloader();
        pr.run();

    }

    public void run()
    {
        ClassLoader loader
            = Thread.currentThread().getContextClassLoader() ;
        PropertyResourceBundle prb;

        while (true) {

            try {
                Thread.sleep(1000l);

                prb = new PropertyResourceBundle
                    (loader.getResourceAsStream("hoge.properties"));
                System.out.println("value = " + prb.getString("value"));

            } catch (Exception e) {
                return;
            }
        }
    }

}



・・・あんまり汚かったんで少し直しました。

[ メッセージ編集済み 編集者: でくのぼう 編集日時 2003-10-08 18:57 ]

[ メッセージ編集済み 編集者: でくのぼう 編集日時 2003-10-08 19:04 ]



すみません、ちょっと気になったので質問なのですが、
なぜこのクラスでは、Runnableをimplementsしているんですか?
(いままで、Runnable = Threadというかってな思い込みがあったため、コードをみて気なったのですがこれは意味があって行っていることなのでしょうか・・)
nori1122
常連さん
会議室デビュー日: 2003/09/14
投稿数: 30
投稿日時: 2003-10-09 10:46
あ、すみません。
上のソースみないで質問してしまいました。

元のソースをみてそうしたんですね。
すんませんでした。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-09 12:14
引用:

すみません、ちょっと気になったので質問なのですが、
なぜこのクラスでは、Runnableをimplementsしているんですか?
(いままで、Runnable = Threadというかってな思い込みがあったため、コードをみて気なったのですがこれは意味があって行っていることなのでしょうか・・)



swingではcomponentの変更をevent dispatch thredで行わなければなりません。
その場合、例えばサイズを変更するのであれば、
コード:
private void hoge() {
    class ResizeRunner implements Runnable {
        public void run() {
            setSize(100, 100);
        }
    }

    Runnable aAction = new ResizeRunner();

    if (EventQueue.isDispatchThread()) {
        aAction.run();
    }
    else {
        SwingUtilities.invokeLater(aAction());
    }
}


というように、threadごとで処理分岐する場合において、Runnable#run()を直接呼ぶこともあります。
JComponent#revalidate()で、こんなことやってたはずです。
上述の例程度であれば、setSize()を直接呼ぶ方が良いでしょうが、処理が複雑であったり、処理をいろいろな箇所で再利用するのであれば、結構有用なので、知っておいて損はないと思います。

# ただ、可読性は落ちるかも知れない。
1

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