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

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

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

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

Q&A

解決済

3回答

3801閲覧

Javaのthreadが起動しない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/03/04 01:45

やさしいJavaを読んで勉強しています
下記のコードですが実行すると

Java

1class Car2 extends Thread{ 2 private String name; 3 4 public Car2(String nm) { 5 name = nm; 6 } 7 8 public void run() { 9 for (int i = 0; i < 5; i++) { 10 System.out.println(name + "の処理をしています"); 11 } 12 } 13} 14class Sample2 { 15 16 public static void main(String[] args) { 17 Car2 car2 = new Car2("1号車"); 18 car2.start(); 19 20 for(int i = 0; i < 5; i++) { 21 System.out.println("Main()の処理をしています"); 22 } 23 } 24}

Java

1Main()の処理しています 2Main()の処理しています 31号車の処理しています 4Main()の処理しています 51号車の処理しています 6Main()の処理しています 71号車の処理しています 8Main()の処理しています 91号車の処理しています 101号車の処理しています

となるはずなのですが実行すると

Java

1Main()の処理をしています 2Main()の処理をしています 3Main()の処理をしています 4Main()の処理をしています 5Main()の処理をしています 61号車の処理しています 71号車の処理しています 81号車の処理しています 91号車の処理しています 101号車の処理しています 11

となります
コードを見返してみても間違えているところは無いと思います
本通りの実行結果にするにはどうすればよいのですか?

開発環境はAtomとコマンドプロンプトです

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

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

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

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

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

unz.hori

2018/03/04 02:07

何度実行してもそうなりますか?
退会済みユーザー

退会済みユーザー

2018/03/04 02:13

何度実行しても同じようになります。 car2.start();をcar2.run()に変えると表示の順番が逆転されます。ということはこれはスレッドは起動されているということなのでしょうか?
unz.hori

2018/03/04 02:20

スレッド自体は起動されていますね。ただ、コンソールに出力されるメッセージが環境によってはランダムに出力されるだけなので気にしなくていいと思います。
退会済みユーザー

退会済みユーザー

2018/03/04 02:24

わかりました。ありがとうございます
guest

回答3

0

複数のスレッドがどういう順番で動作するかは意識的に制御しない限りはオペレーティングシステムのスケジューリング次第です。

それは計算機の性能、その計算機で同時に動いている他のプロセス・スレッドの動作状況などによって影響を受けます。つまり複数回実行すれば毎回実行結果は変わり得ますので、本と同じようにならないことが普通です。

mainスレッドが必ず先に実行されCar2スレッドがその後に実行されるかのように見えますが、それは本の例が若干不適切からかも知れません。たった5回のprintlnの実行なんぞはそれこそ「一瞬のうちに実行完了してしまう」ので、Car2スレッドが動き出す前にmainスレッドの処理が全部終わってしまうことも珍しくはないでしょう。

各々のスレッドでThread.sleepを呼び出すなどして、スレッドの実行にかかる時間がある程度長くなるように工夫すればMain/Car2の印字が入り乱れる様子が観察できると思います。

java

1class Util { 2 static void sleep() { 3 try { 4 Thread.sleep(10); // 10msecスレッドを停止させる 5 } catch (InterruptedException e) { 6 // 割り込みが起きたらRuntimeExceptionに置換する 7 throw new RuntimeException(e); 8 } 9 } 10} 11 12class Car2 extends Thread{ 13 private String name; 14 15 public Car2(String nm) { 16 name = nm; 17 } 18 19 public void run() { 20 for (int i = 0; i < 5; i++) { 21 System.out.println(name + "の処理をしています"); 22 Util.sleep(); 23 } 24 } 25} 26 27class Sample2 { 28 public static void main(String[] args) { 29 Car2 car2 = new Car2("1号車"); 30 car2.start(); 31 32 for(int i = 0; i < 5; i++) { 33 System.out.println("Main()の処理をしています"); 34 Util.sleep(); 35 } 36 } 37}

投稿2018/03/04 02:30

編集2018/03/04 02:31
KSwordOfHaste

総合スコア18394

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

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

0

質問にあるようにスレッド間の同期などをしていないプログラムを実行する場合、スレッドの実行順序は決まっていません。(プログラムで決めていないのですから)

なので、質問にかかれている2つの実行結果は、どちらも正しいです。

例えば、友達が二人いて、一方に「1階の教室から(一人で1つしか運べないサイズの)机を5つ運んできて」と頼み、もう一方に「2階の教室から(一人で1つしか運べないサイズの)机を5つ運んできて」と頼んだとします。

運ばれてきた10個の机のどれが1階からで、どれが2階からなのかは、やってみないと判りませんよね。

友達二人を2つのスレッド、「Main()の処理しています」が1階からの机の到着、「1号車の処理しています」が2階からの机の到着と考えると、動作がイメージできませんか?

スレッドによる並列実行は、そういうものだと理解してください。

投稿2018/03/04 02:30

coco_bauer

総合スコア6915

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

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

0

ベストアンサー

環境によってランダムに表示される

投稿2018/03/04 02:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問