• ベストアンサー

java 競合

こんばんわ. javaのプログラミングについて質問があります. それぞれ独立のプログラムAとプログラムB(~~.java ~.java)があるとします. プログラムAが実行している間にプログラムBが実行されたら任意のエラーメッセージを送出するようなプログラムが書きたいのですが,どうしてもプログラムAの実行が終了するまでプログラムBを実行できません. 実行方法はソケット通信を用いて行っているものです. このようなプログラムはどうすればかけるのでしょうか. ご存知の方ご教授お願いいたします.

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.5

イメージではこんな感じでしょうか。 class A implements Runnable{ … private boolean isExecute=false; public boolean isExecute(){ return isExecute; } //別途、同期(Sychronized)させる必要あり public void run(){ //開始前に実行中フラグを設定 isExecute=true; …処理 //終了後に実行中フラグを解除 isExecute=false; } private Socket socket; public void setSocket(Socket s){ socket=s; } } class B{ public static void main(String[] args){ Thread t = new Thread(new A()); ServerSocket ss = new ServerSocket(…); while(true){ //1.ServerSocket#acceptする。 Socket s = ss.accept(); //2.acceptした際に作成したSocketをA'(スレッド化したA)処理をしていないかチェック。ここも同期が必要 if(!a.isExecute()){ //3.処理中ならエラーメッセージを送出 System.out.println("処理中なのでエラー"); } else{ //4.処理してないならSocketをA'処理を実行。 a.setSocket(s); t.start(); } } } }

namamura
質問者

お礼

ありがとうございます. この回答を元に調べていきたいと思います.

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>その順番で実行していますがバッチではなく手動で行っています 具体的にはどのように行ってますか? 実行環境がWindowsなのかunix系なのか、それ以外なのかわかりませんが 例えばWindowsのコマンドプロンプトで > プログラムA > プログラムB と実行しようとしてもプログラムAが終了しない限りプログラムBは実行できません。 プログラムA, プログラムBを別々のコマンドプロンプトで実行するか 1つのコマンドプロンプトでやるなら > start プログラムA > start プログラムB とすることになります。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

ちょっと気になったのですが、プログラムAとプログラムBはそれぞれどの様に実行してるんでしょうか? 質問内容を見る限りだとバッチで プログラムA プログラムB と順に実行してる感じに思えるんですけど。

namamura
質問者

補足

その順番で実行していますがバッチではなく手動で行っています

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

Aの処理をスレッド化します。 1.ServerSocket#acceptする。 2.acceptした際に作成したSocketをA'(スレッド化したA)処理をしていないかチェック。 3.処理中ならエラーメッセージを送出 4.処理してないならSocketをA'処理を実行。 こんな感じ?

namamura
質問者

お礼

まさしくその感じですありがとうございます。 現在スレッド処理で同時に複数クライアントからの処理を受け付けるサーバープログラムは出来ているのですが、そこから先が出来ていない状態です。 例えば、処理中かそうでないかといった分岐はjavaでどのように記述すればよいのでしょうか?

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

プログラムの関係がよくわかりません。 エラーメッセージを送出するのはプログラムAでしょうか、Bでしょうか。 ServerSocketを持つのはAでしょうか、Bでしょうか、それとも記載のないプログラムCが存在しますか?

namamura
質問者

補足

言葉足らずで申し訳ありません. エラーメッセージを送出するのはプログラムAです. ServerSocketを持つのもプログラムAです. プログラムCは存在しません.

関連するQ&A