java のスレッドについて


javaでスレッドを作って処理をさせたいと思います。

メインのクラスでスレッドAを呼び出し、スレッドAで計算をしてその結果をメインのクラスで利用したい場合、一番簡単な方法は何でしょうか?

なお、メインのクラスは、
while (Thread.isAlive());
な感じでスレッドが終わるまで処理を止めておきたいと思います。

簡単なコードを書いていただけないでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/08/19 10:45:44
  • 終了:2013/08/26 10:50:03

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4440ベストアンサー獲得回数18242013/08/19 12:54:10

ポイント50pt

スレッドのインスタンスに計算結果を抱えておいて、ゲッターメソッドで取得するのが簡単だと思います。

public class Hatena {

    static class MyThread extends Thread {
        private String answer_;
        public String getAnswer() {
            return answer_;
        }

        public void run() {

            /* 時間がかかる計算 */
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println(e);
            }

            answer_ = "hatena";
        }
    }

    public static void main(String[] args) {
        try {
            MyThread th = new MyThread();

            /* 計算開始 */
            th.start();

            /* 計算終了を待ち合わせ */
            th.join();

            /* 計算結果を取得 */
            System.out.println("answer = " + th.getAnswer());

        } catch (InterruptedException e) {
            System.out.println(e);
        }

    }
}


後、スレッドの処理を待ち合わせるのに、こんなことをしては駄目です。

	while (Thread.isAlive());

こっちのループで CPU を食ってしまう。
Thread#join() で待ち合わせてください。

id:zachouR

ありがとうございます、さっそく組み込みました!

待ちも Thread#join()  に切り替えました。

2013/08/20 09:42:03
id:kenichiice No.2

kenichiice回答回数48ベストアンサー獲得回数72013/08/20 02:09:59

ポイント50pt

java.util.concurrent.ExecutorService の submit() を使うのがいいと思ったのですがどうでしょうか。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Hatena {
    public static void main(String[] args) {
        try {
            ExecutorService executor = Executors.newSingleThreadExecutor();
            Future<String> f = executor.submit(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    /* 時間がかかる計算 */
                    Thread.sleep(5000);
                    return "hatena";
                }
            });
            
            /* 計算結果を取得 */
            System.out.println("answer = " + f.get());

            executor.shutdown();
        } catch (InterruptedException | ExecutionException e) {
            System.out.println(e);
        }
    }
}
id:zachouR

Future も調べてみたのですが、いまいち使い方がわからず、でもこれも使いやすいですね、
ありがとうございます、

2013/08/20 09:44:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません