- PR -

OS時間の変更でJavaアプリが止まる

投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-12-28 15:32
JBuilderXを使用して作ったスレッドアプリケーションを実行中に
Windows2000の「日付と時刻のプロパティ」で時間や日付を過去に戻すと
Javaアプリケーションが停止してしまいます。
JBuilderXでブレークポイントを置きデバックしてみたのですが、停止してからは
スレッドも停止しているようでどこで停止しているのか確認できませんでした。
ただ過去に時間を設定後、時間が進み過去に設定する前の時間になると動きだします。

下記はテストとして使用したアプリケーションのスレッド部分です。
JDK1.2です。
コード:
public class clsThread  implements Runnable{
  private Thread thr;
  private boolean flgThread = false;
  void threadOnOff(boolean sw) {
    if(sw){
      if(thr == null) {
        thr = new Thread(this);
        flgThread = true;
        thr.start();
      }
    } else {
      flgThread = false;
      thr = null;
    }
  }

  public void run(){
    while (flgThread) {
      try{
        thr.sleep(1000);
      }catch(Exception ex){}            
      System.out.println("Now Time = " + String.valueOf(System.currentTimeMillis()));
    }
  }
}



なぜ止まってしまうのか?
どこで止まっているのか?
回避できないのか?

などなど、皆さんのご意見お聞かせください
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-12-28 15:38
自己レスです。

ちなみに下記のようなスレッドを使わない、ただ画面をクリックし標準出力するような
プログラムでも時間を過去に設定後はクリックしても反応が無くなりました。
コード:
public class Frame1 extends Frame {
  //フレームのビルド
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  //コンポーネントの初期化
  private void jbInit() throws Exception  {
    this.setSize(new Dimension(236, 283));
    this.setTitle("TEST");
    this.addMouseListener(new Frame1_this_mouseAdapter(this));
    this.setLayout(null);
    this.setResizable(false);
    this.setVisible(false);
  }
  //ウィンドウが閉じられたときに終了するようにオーバーライド
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }
  void this_mouseClicked(MouseEvent e) {
    System.out.println("click");
  }
}

class Frame1_this_mouseAdapter extends java.awt.event.MouseAdapter {
  Frame1 adaptee;
  Frame1_this_mouseAdapter(Frame1 adaptee) {
    this.adaptee = adaptee;
  }
  public void mouseClicked(MouseEvent e) {
    adaptee.this_mouseClicked(e);
  }
}

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-28 15:39
sleep を始めた瞬間にスレッドが起きる時刻が決定しますが、日付を過去に戻したらその時刻はしばらく訪れません。
よってなかなか起きあがってくれないのではないでしょうか。
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-12-28 15:57
インギさんご意見ありがとうございます。

って事は、私が2つめに上げたスレッドを使わない例だとメインスレッド内のスリープ
で止まってしまっていると考えて良いのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-28 16:03
だと思います。
スレッドダンプをとればどこで止まっているか確認できますよ。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-12-28 16:26
unibon です。こんにちわ。

うろ覚えなのですが、わりと最近(ここ1か月ほど前に)、似たような話題をどこかで見た記憶があります。OS によって Java のなにかの実装が異なっていて、Windows だと止まるけど Linux とかだと止まらない、というようなことでしたが、どこでしたっけ?

と思ったら、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17566&forum=12
でした。ここでもインギさんがご回答されていましたね。
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-12-28 16:28
「dumpStack()」メソッドを使用してみたのですが、
そこへ行く前に止まってしまいます・・・

ちなみにスレッドを使わないほうのロジックの下記の部分にメインスレッドの
ダンプ取得処理を加えたのですが、時間を戻してからクリックしても停止している
為処理が行われません・・・
それともインギさんのおっしゃった「スレッドダンプ」を僕が誤認識してます?
コード:
  void this_mouseClicked(MouseEvent e) {
    System.out.println("click");
    Thread th = Thread.currentThread();
    th.dumpStack();
  }

taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-12-28 16:50
unibonさん、ご意見ありがとうございます。

unibonさんに教えていただいた
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17566&forum=12
も拝見したのですが、どうしようもないのかな?と思い似たようなスレッドですが
上げさせていただきました。
やはりどうしようもな・い・の・か・な・・・

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