Javaのスレッドはどういう風に考えればいいか。
特にinterrupt/yield/joinの類である。
インターネット上には適切に理解するページが無く、よって私が作った。
私の理解や認識を書き起こしたもので、厳密には違うかもしれないが、個人的にはこれで合っていると思っている。
最初に文章をだらだらと書いたが、直感的に知りたい人は、このページの下部にどういう処理を行ったのかという図を書いたので、そちらを参照頂きたい。
また、QAで同時質問しているが、CPUが複数ある場合は同時進行もできるようである。
ただその場合は話が煩雑になるので、CPUが1つのパターンを想定して図を書いた。
1.用語定義
Javaの日本語訳は、とにかく表面上の語句・語彙しか使っていなく、その動作の本質を伝えていない。
よって私が(私用に)分かりやすく再翻訳した。
interrupt・・・参考書などでは「割り込み」と書かれていて、一般的にもそのような表現になっているが、完全に誤訳だ。本来であるならば「強制中断」が正しいと思われる。
interruptの訳語は、「継続している何かを途中で外側から強制的に中断させたり邪魔をする」と言うのが第一義で、日本語のニュアンスで言う「継続している主体を一時静止させて、別の個体を主体がいた手前に参加させる」と言う意味での「割り込み」は第二義だ。そしてそうした処理はスレッドのinterruptで発生していない。
後の図で詳しく述べるが、結果的には後続処理が詰めて処理されるので「割り込み」が発生しているという見方もできなくはないのだが、基本的にはJavaスレッドでのinterruptを発動させる思想背景は、そのスレッド処理をその時点で「中断(interrupt)」させたいからそうするのである。他の処理を優先して「割り込ませ(interrupt)」たいからそうしているのではないと、このinterruptが使用されている前後関係からそう私は推測する。
尚、Java Gold SE8(山本道子著)では、その373ページに「休止中のスレッドに割り込みを入れる。」と記載する。
yield・・・Java Gold SE8(山本道子著)では、「現在実行しているスレッドを一時的に休止し、他のスレッドに実行機会を与える」と書かれる(P371)。つまりは休止の概念なのだが、これは実行権限の優先順位を他のスレッドに移譲した上で自分が待機状態に入る、と言うのが正しいように思われる。
yieldの日本語訳としては、産出する、産む、もたらす、ひきおこす、などがあるが、第二義的なの語義として「明け渡す」「譲渡する」があるのでこちらが概念としては近い。
join・・・Java Gold SE8(山本道子著)では、「実行中のスレッドが終了するまで待機する」と書かれる(P371)。
joinの日本語訳としては「結合する、(…を)接合する、つなぐ、取り付ける、結合させる、加わる、加入する、(…の)仲間になる、帰任する、一緒になる」となるのだが、これの意訳文には「合流する」があり、これが一番近い。合流するまで待機する(合流地点をここに設定する)と言うのが正しいように思われる。
2.実際の処理の動き
実際CPU一個の場合の時分割処理において、マルチスレッドが行儀よく遂行された場合の模式図を書いてみた。
私のメモなので、改めて見ると処理の順番が他の人にはかなり分かりにくいが、そこは省略した。








特にinterrupt/yield/joinの類である。
インターネット上には適切に理解するページが無く、よって私が作った。
私の理解や認識を書き起こしたもので、厳密には違うかもしれないが、個人的にはこれで合っていると思っている。
最初に文章をだらだらと書いたが、直感的に知りたい人は、このページの下部にどういう処理を行ったのかという図を書いたので、そちらを参照頂きたい。
また、QAで同時質問しているが、CPUが複数ある場合は同時進行もできるようである。
ただその場合は話が煩雑になるので、CPUが1つのパターンを想定して図を書いた。
1.用語定義
Javaの日本語訳は、とにかく表面上の語句・語彙しか使っていなく、その動作の本質を伝えていない。
よって私が(私用に)分かりやすく再翻訳した。
interrupt・・・参考書などでは「割り込み」と書かれていて、一般的にもそのような表現になっているが、完全に誤訳だ。本来であるならば「強制中断」が正しいと思われる。
interruptの訳語は、「継続している何かを途中で外側から強制的に中断させたり邪魔をする」と言うのが第一義で、日本語のニュアンスで言う「継続している主体を一時静止させて、別の個体を主体がいた手前に参加させる」と言う意味での「割り込み」は第二義だ。そしてそうした処理はスレッドのinterruptで発生していない。
後の図で詳しく述べるが、結果的には後続処理が詰めて処理されるので「割り込み」が発生しているという見方もできなくはないのだが、基本的にはJavaスレッドでのinterruptを発動させる思想背景は、そのスレッド処理をその時点で「中断(interrupt)」させたいからそうするのである。他の処理を優先して「割り込ませ(interrupt)」たいからそうしているのではないと、このinterruptが使用されている前後関係からそう私は推測する。
尚、Java Gold SE8(山本道子著)では、その373ページに「休止中のスレッドに割り込みを入れる。」と記載する。
yield・・・Java Gold SE8(山本道子著)では、「現在実行しているスレッドを一時的に休止し、他のスレッドに実行機会を与える」と書かれる(P371)。つまりは休止の概念なのだが、これは実行権限の優先順位を他のスレッドに移譲した上で自分が待機状態に入る、と言うのが正しいように思われる。
yieldの日本語訳としては、産出する、産む、もたらす、ひきおこす、などがあるが、第二義的なの語義として「明け渡す」「譲渡する」があるのでこちらが概念としては近い。
join・・・Java Gold SE8(山本道子著)では、「実行中のスレッドが終了するまで待機する」と書かれる(P371)。
joinの日本語訳としては「結合する、(…を)接合する、つなぐ、取り付ける、結合させる、加わる、加入する、(…の)仲間になる、帰任する、一緒になる」となるのだが、これの意訳文には「合流する」があり、これが一番近い。合流するまで待機する(合流地点をここに設定する)と言うのが正しいように思われる。
2.実際の処理の動き
実際CPU一個の場合の時分割処理において、マルチスレッドが行儀よく遂行された場合の模式図を書いてみた。
私のメモなので、改めて見ると処理の順番が他の人にはかなり分かりにくいが、そこは省略した。








※コメント投稿者のブログIDはブログ作成者のみに通知されます