現在JavaGoldの問題を解いていて理解しづらいところがあるので質問させてください。
Threadクラスの問題(問題78)なのですが、
結論から言うと
なぜ実行結果が「ex2 run run」や「run ex2 run」になるときがあるのか理解しがたいです。
コードは以下です。
Java
1class Foo implements Runnable { 2 public void run() { 3 try { 4 System.out.print("run "); 5 Thread.sleep(1000); 6 } catch (InterruptedException e) { System.out.print("ex1 "); } 7 } 8} 9class Test { 10 public static void main(String[] args) { 11 Foo obj = new Foo(); 12 Thread t1 = new Thread(obj); 13 Thread t2 = new Thread(obj); 14 try { 15 t1.start(); 16 t2.start(); 17 t1.start(); 18 } catch (Exception e) { System.out.print("ex2 "); } 19 } 20} 21
調べていると次のような説明がありました。
start()メソッドを呼び出した時点で、スレッドが即座に実行を開始するわけではありません。start()メソッドは、スレッドを「実行可能状態」にします。
そのため実行開始するタイミングはコードの順番とは限らないため「run run ex2」になるとは限らず「run ex2 run」となるときもあるのかなと仮定しています。
だとしてもなぜ「ex2 run run」になるのかは解釈できません。
ex2が出力されるのはExceptionが発生したからであり、その原因は「1つのスレッドオブジェクトに対し、2回start()メソッドを呼び出した」からだと思っています。だとすると1度目にいきなり「ex2」が出力されるのは辻褄が合いません。
そこで**「run ex2 run」になるときの私なりの解釈があっているかやなぜ「ex2 run run」になるときがあるのか**を教えていただきたいです。
もし分かる方がいらっしゃればお願い致します。
※追記
「ex2 run run」に関しても同じことが言えるのでしょうか。
start()メソッドを呼び出した時点で「実行可能状態」にはしたけれど、「実行開始」はされていない。
その「実行開始」されるまでに「2回start()メソッドを呼び出す」ことが発生するとき、「ex2 run run」と出力される。
私はこのように仮定してみましたが、どうでしょうか。わかる方がいればよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/08 15:17