- PR -

java.lang.Threadを用いた処理について

投稿者投稿内容
ビーンズ
常連さん
会議室デビュー日: 2007/10/02
投稿数: 20
投稿日時: 2008-05-22 16:11
java.lang.Threadを用いた処理で問題が発生し、解決できずに困っています。
どなたかご教授よろしくお願いします。

【環境】
 JDK1.4.2_08
 Swingアプリ

【問題】
Swingのアプリを開発しています。
画面A(A.jar)から画面B(B.jar)を起動する際に、java.lang.Threadを利用しています。

 th = new Thread("java -cp A.jar;B.jar;〜***.******.ProgramMain");
 th.start();

以前はこれで問題なく画面Bが起動していたのですが、
ある日突然起動しなくなりました。
デバッグをしてみましたが、th.start();を何も無く素通りし、
最後まで流れていってしまう状況です。
ソースも変更していません。
しかしながら、コマンドプロンプトより同じコマンドを実行すると、
画面Bは起動します。

何か環境が変わってしまったのか・・・見当がつきません。
なにか心当たりがある方がいればアドバイスをお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-05-22 16:39
引用:

 th = new Thread("java -cp A.jar;B.jar;〜***.******.ProgramMain");
 th.start();



これ、もともと動いていないのでは?
java.lang.Threadの文字列を引数とするコンストラクタは、
スレッド名を指定するだけです。コマンドではありません。
また、オーバーライドもしていなければ、Runnableのインスタンスも渡していません。

なので、何も行われないのが正解で、何か動いていたのであれば、
それは別のコードによって動かしていることになるでしょう。
ビーンズ
常連さん
会議室デビュー日: 2007/10/02
投稿数: 20
投稿日時: 2008-05-22 16:46
かつのりさん、回答ありがとうございます。

 業務上、ソースを公で見せるのには問題がありましたので、
 ざっくり書いてしまいました。
 申し訳ありません。

 Thredクラスを継承したクラスがあり、そのなかで
 オーバーライドしています。
  public void run() {
Process proc = Runtime.getRuntime().exec(("java -cp ・・・");
  }

回答よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-05-22 17:41
System.out.println(proc.waitFor());

これで何が表示されるでしょうか?
実行結果の標準出力もしくはエラー出力を取得して、
表示してみると、何かエラーが出ているかもしれません。
ビーンズ
常連さん
会議室デビュー日: 2007/10/02
投稿数: 20
投稿日時: 2008-05-23 08:52
おはようございます。
かつのりさん、アドバイスありがとうございます。

>System.out.println(proc.waitFor());
>これで何が表示されるでしょうか?

 確かに指摘の通り、”1”が帰ってきました。
 ProcessのAPIでは正常時には”0”が返ってくるみたいなので、
 何らかの問題があるのは確かなようです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-23 09:14
引用:

ビーンズさんの書き込み (2008-05-22 16:46) より:
 Thredクラスを継承したクラスがあり、そのなかで
 オーバーライドしています。


「Thred」とは Thread ということでしょうか。よほどのことがない限り Thread を継承したりはしないものだと思います。可能ならば、戻って、これを見直されたほうが良いと思います。

もし現行のままやるとすれば、再現するはずの最小限のコードにしてやってみたほうが良いでしょう。もしそれで再現しなくなるようであれば、掲示板に提示されていない箇所に原因がある可能性が高いでしょう。

#以下、追記。

Thread の継承を勘違いしていました。なにか改造という意味かと思っていました。run のオーバーライドならば問題ないですね。Therad に関する記述は取り消します。すみません。

[ メッセージ編集済み 編集者: unibon 編集日時 2008-05-23 09:33 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-05-23 09:23
procのgetErrorStream()とかgetOutputStream()には何も出ないんですかね?
ビーンズ
常連さん
会議室デビュー日: 2007/10/02
投稿数: 20
投稿日時: 2008-05-23 09:36
1つ重要なことを書き忘れていましたが、同じプログラムを他のPCにて実行すると、
正常に起動します。私の動作環境に問題があるのでしょうか・・・だとしても、何がこの処理に影響を与えているか見当もつきません。

unibonさん、回答ありがとうございます。

>もし現行のままやるとすれば、再現するはずの最小限のコードにしてやってみたほうが>良いでしょう。
 確かに、どのあたりに問題があるかもつかめていないので、
 余分な処理を全て除外したシンプルなクラスを用意して調べているところです。

mioさん、回答ありがとうございます。

>procのgetErrorStream()とかgetOutputStream()には何も出ないんですかね?
 何も出ていないようです。
 エラーでもでてcatchされれば話は早いのですが・・
 今私には問題の判断材料が何もない状況です。

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