質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

解決済

3回答

4452閲覧

Java マルチスレッドの使い方について

t-miyazaki

総合スコア71

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

1クリップ

投稿2015/07/20 02:55

Javaで時間の掛かる計算を複数のスレッドを立てて並列に計算したいのですが、
スレッドを初めて使うため、プログラムの書き方がこれでよいのか分かりません。
マルチスレッドの定石・鉄則などありましたらお教えいただければ幸いです。

やりたいことは、引数を与えて時間の掛かる計算を複数のスレッドで別々に同時に
行ない、計算結果を1つの配列変数に代入するというものです。

Java

1import java.lang.Thread.State; 2 3public class Main { 4 // 計算結果を格納する配列 5 static int[] res = new int[10]; 6 7 public static void main(String[] args) { 8 Main m = new Main(); 9 // スレッドの作成と開始 10 Thread[] threads = new MyThread[10]; 11 for (int i = 0; i < res.length; i++) { 12 threads[i] = m.new MyThread(i); 13 threads[i].start(); 14 } 15 // 全てのスレッドが終了するのを待機 16 for (;;) { 17 int i; 18 for (i = 0; i < res.length; i++) { 19 if (threads[i].getState() != State.TERMINATED) break; 20 } 21 if (i == res.length) break; 22 } 23 // 結果を標準出力する 24 for (int x : res) { 25 System.out.println(x); 26 } 27 } 28 29 // 計算スレッド 30 public class MyThread extends Thread { 31 private int i; 32 33 public MyThread(int i) { 34 this.i = i; 35 } 36 37 @Override 38 public void run() { 39 // 本来はここで時間のかかる計算を行なう 40 try { 41 Thread.sleep(10000); 42 } catch (InterruptedException e) { 43 } 44 res[i] = i * i * i; 45 } 46 } 47}

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

投稿2015/07/20 03:17

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t-miyazaki

2015/07/20 13:33

回答ありがとうございます。 Concurrency Utilitiesを調べてみます。
guest

0

ベストアンサー

まず、マルチスレッドプログラミングと並行処理プログラミングは違います。

マルチスレッドはCPUが1コアでもできます。そして、それぞれのスレッドを協調させるために、ロック、セマフォ、シンクロなどを使います。

並行処理は複数のCPUコアを使うものなので、CPUが複数ないとできません。ただ、OSとしてCPUを確保するAPIを提供していないため、代わりにスレッドを使っているに過ぎません。

並行処理は高度なパフォーマンスチューニングです。複数のCPUを同時に稼働させることで処理速度を稼ぐので、ロック、セマフォ、シンクロなどは使ってはいけません。これらのものは、スレッドを一時停止させます。
並行処理の場合は、ロックなどを使用せずに、スレッドセーフなプログラムをしなければなりません。
アルゴリズムの全面的な見直しが必要になることもあります。

しかし、全ての処理が並行化できるとは限りません。直列的に処理しなければならない部分もあります。並行化可能な処理と直列な処理を完全に分離してください。2つの処理を混ぜてはいけません。

java.util.concurrentパッケージが上記の処理をサポートしてくれます。

投稿2015/07/20 04:44

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t-miyazaki

2015/07/20 13:36

回答ありがとうございます。 マルチスレッドと並列処理は違うものなのですね。 似たようなものとして混同していたかもしれません。 詳しく教えていただきありがとうございました。
guest

0

argiusさんのおっしゃる通り、Concurrency Utilitiesを利用した方がいいかと思われます。

どうしてもThreadを利用してみたいという場合は、ThreadだけでなくHandlerやsynchronizedについても学ぶ必要があり、学習コストがやや高めです。

投稿2015/07/20 04:19

shiolier

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t-miyazaki

2015/07/20 13:34

回答ありがとうございます。 このような場合はConcurrency Utilitiesが有用なのですね。調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問