JAVAでプログラムを書く上で、Aという処理が終了次第、Bという処理を実行したい場合どうすればいいのでしょうか?
/////////////////////////////////////////////////////////////////
例えば、
・ファイルにデータを出力する。(例えば、バッチファイルhoge.batとして)
その後、すぐに
・そのバッチファイルを実行する命令を書く(Runtime.exec(hoge.bat);
/////////////////////////////////////////////////////////////////
このプログラムを実行した場合、スレッドAがファイルにデータを出力し終わる前に勝手にスレッドBが作られ、Runtime.exec(hoge.bat);が実行されてしまいます。正しくスレッドAが終了し終わった後にスレッドBが実行し始めるようにするにはどうすればいいのでしょうか?教えてください。お願いします。
No.5ベストアンサー
- 回答日時:
(1) スレッドの実行用クラス
public class Test {
private boolean finished;
private ExeFile exefile;
class Thread_A extends Thread {
public void run() {
try {
exefile.create(); // ファイルを作成
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
class Thread_B extends Thread {
public void run() {
try {
exefile.exec(); // スレッドAの作成したファイルの中身を表示
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void test() {
exefile = new ExeFile();
new Thread_A().start();
new Thread_B().start();
}
public static void main(String[] args) {
Test t = new Test();
t.test();
}
}
(2) 複数のスレッドからアクセスされる可能性のある処理クラス
import java.io.*;
public class ExeFile {
private File file;
private boolean created;
public synchronized void create() throws InterruptedException {
file = new File("c:/test.txt");
try {
OutputStream out = new FileOutputStream(file);
byte[] text = "It's a test program.".getBytes();
out.write(text); // ファイルにテキストを書き込む
}
catch (IOException ex) {
ex.printStackTrace();
}
Thread.sleep(3000); // wait,notify の動きが明瞭に確認できるよう3秒スリープ
created = true;
notify(); // wait中のスレッドに通知
}
public synchronized void exec() throws InterruptedException {
while (!created)
wait(); // ファイルが作られてなかったら待機
try {
InputStream in = new FileInputStream(file);
int size = (int)file.length();
byte[] text = new byte[size];
in.read(text); // ファイルの読み込み
System.out.println(new String(text)); // ファイルの内容表示
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
No.4
- 回答日時:
回答2 について。
いいかげんな回答をしてすいません。
こんなコードじゃ絶対動かないですね。
それで、ちゃんとした回答をしようと、色々考えてたのですが、
どうしても、長くなってしまいます。
とりあえず、テスト済みのコードを載せますので、
質問等あったら改めておねがいします。
No.3
- 回答日時:
あと、処理にもよりますが、ただの join() でいいかも知れないです。
public class Test2 {
class Thread_A {
public void run() {
// 処理A;
}
}
class Thread_B {
public void run() {
// 処理B;
}
}
public void test() {
Thread th = new Thread_A();
th.start();
th.join();
new Thread_B();
}
}
No.2
- 回答日時:
ただのループだと、オーバーヘッドが大きいので、
wait() と notify() を使ったらどうでしょう。
下がサンプルです。finishedフィールドと、wait()をくくってるループは
なくても正常に動くと思いますが、wait()は保険のため
ループでくくるのが定石になってます。
mainメソッドは省略です。
public class Test {
private boolean finished;
class Thread_A extends Thread {
public void run() {
// 処理A;
finished = true;
nofity();
}
}
class Tread_B extends Thread {
public void run() {
while(!finished) {
wait();
}
// 処理B;
}
}
public void test() {
new Thread_A().start();
new Thread_B().start();
}
}
すごいわかりやすいソースをありがとうございます。
非常に助かりました。
僕はこの業界に足を踏み入れたいと考えている大学生なので、あなたのプロフィールの「一般人」というのを見ると自分が情けなくなります。
とにかく、ありがとうございます。感謝感謝です。
No.1
- 回答日時:
synchronizedを使用すればいいように思えますが…
スレッドにフィールド(finished)を追加してwhileループを使用してみてはいかがですか?
少々長いですがサンプルソースを載せます。
public class ThreadTest {
class Class1 extends Thread {
public boolean finished = false;
public void run( ) {
finished = false;
//処理1
finished = true;
}
}
class Class2 extends Thread {
public boolean finished = false;
public void run( ) {
finished = false;
//処理2
finished = true;
}
}
Class1 class1;
Class2 class2;
// コンストラクタ
public ThreadTest() {
class1 = new Class1();
class2 = new Class2();
}
// スレッド実行部
public void start() {
class1.start();
// ↓追加部分
while(!class1.finished){}//実行中は無限ループ
class2.start();
}
public static void main(String[] args) {
ThreadTest test = new ThreadTest();
test.start();
}
}
あとは…参考URL次第ですね…
参考URL:http://java.sun.com/products/jdk/1.2/ja/docs/ja/ …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- その他(プログラミング・Web制作) フォルダ内の特定 拡張子のファイルを一括実行するBat ファイルについて 4 2022/04/17 09:51
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C# 矢印キーの取得
-
ユーザーコントロールを動的に...
-
unityでのC++エラーの原因がわ...
-
C# DataGridView列カスタマイズ
-
C# visibleプロパティをfalseに...
-
getConnection( )メソッドの戻り値
-
C# 半角カナの文字化けについて
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
LVM_SETITEMSTATEでListViewの...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
1~100までの数字を表示したい
-
VBで作った乱数を一度も重複さ...
-
数値⇒漢数字変換 java
-
flush()とclose()について
-
1~100までの数字を表示し、か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
Thread.sleepのInterruptedExce...
-
unityでのC++エラーの原因がわ...
-
C#で別のFormへ複数の値を返そ...
-
C# visibleプロパティをfalseに...
-
エンターキーを押すとOKボタン...
-
Processingでマウスクリックで...
-
[C#.net]スレッド化された別フ...
-
C#でキーイベントが発生しない...
-
C# DataGridView列カスタマイズ
-
【C#】ソースコードをファイル...
-
LVM_SETITEMSTATEでListViewの...
-
GetDIBits関数の使い方について
-
未割り当てのローカル変数
-
C# MouseHoverを何度も呼ぶには
おすすめ情報