‫お帰りなさい｡
‫このビデオでは､ joinとis aliveについて話したいと思います｡
‫つまり､ joinはスレッドやスレッドクラスが持っているメソッドであり､ それを利用することができ､ それがプロパティとして生きているのです｡
‫スレッド､ 関数､ 関数へのスレッドの2つのメソッドを作成しました｡
‫そして､ 何をするかというと､ ただ始めたというだけです｡
‫そこで､ 3つ目の機能がスタートし､ 機能へのスレッドがスタートしました｡
‫ですから､ あとはそれをコピーするか､ 自分で作ってしまえばいいのです｡
‫だからここでは､ ドメインスレッドが始まったと言い､ 最後にはメインスレッドが終了したと言うことにしています｡
‫今のところ目新しいものはありません｡
‫例えばコントロール5でそれを開始すると､ コンソールが起きたままになります｡
‫本スレッド開始､ 本スレッド終了｡
‫いずれかのキーを押して続行します｡
‫なるほど｡
‫だから､ 始まって終わって､ 本当にあっという間の出来事だったことがわかります｡
‫だから､ ここでは特に何も起こらない｡
‫では､ 今度はそれを変えましょう｡
‫そこに何かスレッドを作ろう｡
‫そこで､ スレッド1という新しいスレッドを作ってみましょう｡
‫だからスレッド｡
‫そして､ スレッドを使用するためには､ システムのスレッドを使用して実装する必要があります｡
‫これでスレッドが使えるようになったので､ その1スレッドを1ということにします｡
‫そして､ それは単にスレッド関数1またはスレッド1関数を呼び出す新しいスレッドになるのです｡
‫このコードを実行すると､ このメソッドを呼び出すことができます｡
‫そして次に､ もう一つのスレッド､ これをスレッド2と呼ぶことにしますが､ これもスレッドとここのスレッドを機能させるためのものです｡
‫このように､ スレッドスタート､ パラメタライズドスレッドスタート､ スレッドスタートと複数のオーバーロードが存在するのです｡
‫だから､ やるのはこのスレッドスタートだけなんです｡
‫つまりstartは､ スレッドが実行を開始したときに呼び出されるメソッドを表すスレッド開始デリゲートです｡
‫したがって､ これが私たちのメソッドになるわけです｡
‫つまり､ このスレッド1やこのサード1の関数は､ 実際にはメソッドではなく､ オブジェクト指向のクラスの中にないので関数なのです｡
‫しかし､ とにかく､ その関数を作ってみましょう｡
‫見ての通り､ ここでは実際にデリゲートと呼んでいないので､ 括弧は必要ありません｡
‫わかりました｡
‫そこで次に必要なのは､ それらのスレッドを単純に開始することです｡
‫では､ そのスレッドワンドットスタートとスレッドトゥスタートをやってみましょう｡
‫コントロール F 5 を押して起動すると､ メインスレッドの開始､ メインスレッドの終了､ スレッド
‫1 の関数の開始､ 3 番目の関数の開始が表示されます｡
‫まだエンディングメッセージを実装していないので､ 終了していないのですね｡
‫それでは､ この2つのネジにジョイントメソッドを使用してみましょう｡
‫そこで､ スレッドワンドットジョインと､ 参加したものを確認してみましょう｡
‫Jointは､ 標準的なcomとsend message pumpingの実行を継続しながら､ このインスタンスによって表される赤が終了するまで､
‫呼び出したスレッドをブロックします｡
‫そこで､ この2つのスレッドを単純にコムする､ あるいは結合することになります｡
‫つまり､ このメインスレッドとのスレッドは､ このジョイントメソッドが行うことで､ その時間だけメインスレッドをブロックしているのです｡
‫つまり､ メインスレッドから呼び出されるわけです｡
‫そのため､ メインスレッドをブロックしてしまうのです｡
‫だから､ 一般に呼び出し側のスレッドをブロックするといいます｡
‫そして､ 私たちの場合､ 呼び出すときにメインスレッド内にいるので､ 呼び出し側のスレッドがメインスレッドになります｡
‫ではどうするかというと､ 2つ目のスレッドにも参加するのです｡
‫そこで､ これをこの2つに結合して､ コンソールに何かを書き込んでみましょう｡
‫CW そして､ スレッド1の機能が終わったとします｡
‫そして､ 2つ目も同じようにしましょう｡
‫では､ もう一度実行してみましょう｡ 実際には何も起こりません｡
‫させてください｡
‫コントローラ5を押す そうすれば､ 私のコンソールは起きたままです｡
‫メインスレッドは､ 3番目の関数が開始された関数に開始されました｡
‫そして､ ここでは機能するためにスレッドと呼ばれるべきです｡
‫よし､ これでスレッド1とスレッド2が終了し､ その後メインスレッドだけが終了したと表示されたぞ｡
‫だから､ 派手さはないし､ 目新しさもない｡
‫開発したものを順次実行していくだけです｡
‫ここではそのような感じになっていますね｡
‫でも､ それなら面白いことをやろうよ｡
‫ここにスリープを入れよう｡
‫そこで実際に､ スレッドを3秒間スリープさせることにしましょう｡
‫だからスレッドスリープ､ 3000ミリ秒｡
‫そしてこのメソッドは､ メソッド､ スレッドの開始､ そして3秒間の待機と表示されることになります｡
‫では､ もう一度､ 実際にcontrol f 5で実行してみましょう｡
‫では､ ここで､ 機能､ スタートです｡
‫そしてしばらくして､ スレッドワン機能｡
‫完了しました｡
‫実際に簡単に再現してみましょう｡
‫3秒後に3番目の関数が終了し､ 3番目の関数が終了し､ メインスレッドが終了しているのがわかります｡
‫つまり､ メインスレッドは､ メインまたは3番目のスレッドが終了するまで待機しているのです｡
‫そして､ それは私たちがここに参加するからこそ起きていることなのです｡
‫そこで､ スレッド1に参加し､ 「よし､ 終わるまで待ってくれ」と言うのです｡
‫さて､ ジョイント方式を見ると､ 他にも興味深いことがあります｡
‫オーバーロードは複数あるので､ ご覧のように1つだけだったり､ ここではパラメータや与えた引数がゼロだったりしますが､
‫複数あります｡
‫そこで､ ここに別の引数を追加して､ 先に進む前に待ちたい時間を指定することができます｡
‫ここでは､ ifスレッドドットを使用することにしています｡
‫そこで､ 1/2を待つとします｡ このスレッドに1/2の終了時間を与え､ 時間内に終了した場合はスレッド1の関数が完了したと言い､
‫そうでない場合はスレッド1の関数が1/2以内に終了しなかったというようなことを言います｡
‫では､ このジョイントを取り除き､ 実際にすべてのコードをこれに置き換えてみましょう｡
‫それでは､ もう一度実行してみましょう｡
‫5をコントロールする｡
‫そのため､ フロント機能の1/3が1/2スレッド以内に行われず､ メインスレッドが終了してしまいました｡
‫ですから､ ご覧の通り､ 指定された期間内に行われなかったのです｡
‫しかし､ このスレッドを見ていなかったので､ ここで別のコードを追加してみましょう｡
‫1機能終了｡
‫そこで､ mainに帰ってくるスレッド1関数のようなものを追加してみましょう｡
‫ということは､ かなり完成度が高いということですね｡
‫あるいは､ メインではないのかもしれません｡
‫しかし､ 色をつけるために､ もう一度コントローラ5で動かしてみましょう｡
‫それで､ 機能に対する脅威が始まったのですが､ 実際にもう一度呼んでみますと､ OCのメインの脅威が終わってから､
‫その3秒後に3番目の機能が色に戻ると書いてあります｡
‫つまり､ 主な脅威はすでに終わっていて､ その時だけ色に戻った､ ということです｡
‫その時になって初めて､ 30行目か､ 実はその後によく来るんです｡
‫つまり､ mainメソッドで行われ､ そのときだけ､ ここにあるコードが実行されたわけです｡
‫そのため､ ご覧のように1/2だけメインスレッドをブロックしています｡
‫まで､ 主な脅威をブロックすることはありませんでした｡
‫つまり､ このインスタンスが表すスレッドが終了するか､ 指定された時間が経過するまで､ 呼び出し元のスレッドをブロックし､
‫静的コメントとマージポンプングの実行を継続すると言うことです｡
‫つまり､ メインスレッドは､ 1/2を待ってください｡
‫つまり､ スレッド2に参加して､ よし､ 終わった､ スレッドメインの脅威は終わった､
‫よくスレッド1の関数はまだ実行中だ､ またはスレッド1はまだ実行中で､ その後スリープしてコードを実行中だ､
‫と言うだけなのです｡
‫しかし､ ここにあるように時間的にそうならないのです｡
‫だから､ 本丸はもう待てなかったのだ｡
‫ただ､ よし､ 私は進むぞ､ あなたなしで進むぞ､ ということでした｡
‫それがスレッドに参加することなんですね｡
‫ここで､ その様子をご覧ください｡
‫そして次に､ これはライブのプロパティであることを見てみましょう｡
‫スレッド1が生きている場合､ このプロパティがあり､ ご覧のように現在のスレッドの実行状態を示す値を取得します｡
‫つまり､ そのスレッドは完了したのか､ それとも完了していないのか？
‫だから､ まだスレッドが生きている場合はここに書いてある｡
‫だから､ このコードが実行される時点でまだ実行されているなら､ 何かをしてください｡
‫だから､ スレッド1はまだ何かやっているから､ まだ実行中､ コードを実行中､ それ以外はスレッド1が完了したからCWスレッド1が完了した､
‫みたいな書き方をしているだけです｡
‫わかりました｡
‫そして､ ここではもちろん､ 今すぐ文字列を完成させる必要があります｡
‫もう一度確認してみましょう｡
‫そして､ 本スレッドが終了し､ 実は私のコンソールも終了します｡
‫そこで､ まず制御f 5のメインスレッドが開始され､ スレッド1の関数が開始され､ といった具合にします｡
‫だから､ 1/2以内にはできなかったんです｡
‫そして､ スレッド機能2が行われた｡
‫だから､ よし､ もう待たないぞとなるわけです｡
‫本スレッドです｡
‫すると､ スレッド2が実行されるわけです｡
‫3人目はまだいろいろやってる｡
‫つまり､ スレッド1が生きていて､ 実行され､ その後に初めて主な脅威が終わるということです｡
‫このコードが実行され､ 38行目からスレッド1の関数が呼び出され､ 実行されます｡
‫わかりました｡
‫ということが確認できるわけです｡
‫シンプルに確認することができます｡
‫なるほど｡
‫脅威は生きているのかいないのか？
‫それをもとに､ いろいろなことを実行できるわけですから､ かなり便利です｡
‫では次に､ 脅威の方がまだ定期的に何かやっていることを確認したいとしましょう｡
‫ここでforループを使い､ Iが0に等しいとしよう I below ten I plus plus.
‫そこで､ このforループの中で､ 次のコードを実行したいと思います｡
‫そして､ s脅しているのはまだ何かやっていると言って､
‫300ミリ秒の間スリープします｡
‫300人分の睡眠をとるわけですから､ 脅威が完了するまでに10回の実行が必要になるわけです｡
‫では､ もう一度実行してみましょう｡
‫スレッド1がまだ色々やってる終わってる終わってる｡
‫そしてご覧のように､ 脅威のスリープが300秒､ 3000秒とミリ秒あったのに､ こちらは300ミリ秒しかなかったのに､
‫10回実行されませんでした｡
‫その結果､ スレッド1が複数回実行されるようになりました｡
‫ですから､ ご覧のようにスレッド機能が復活しているところに重なりがあります｡
‫ご覧の通り､ このforループは少し後にしか実行されません｡
‫というわけで､ 順番は以下の通り｡
‫スレッド1を開始します｡
‫私たちは､ スレッド1の開始を右から始めます｡
‫1/2を待ったので､ 1/2結合があることがわかります｡
‫つまり､ このスレッドではすでに3回の実行が失われています｡
‫そして､ スレッド1機能が始まったので戻ってくる｡
‫そして､ 1/2を待った｡
‫その時は何も起きなかった｡
‫その時だけ､ こんな美しいことができるようになったんです｡
‫つまり､ このforループは10回実行されるので､ 色に戻るまでこのsleepを複数回実行することになります｡
‫そして完成したこの3本目は､ 超高速で実行されます｡
‫だから､ そこに睡眠がないから待てないのです｡
‫でも､ このアライブドでできるのは､ だいたいそんなところでしょう｡
‫だから､ 一般的にチェックできるのは､ 人生なのか？
‫まだ生きているのか？
‫生きているうちにいろいろやるのか､ 生きているうちに他のことをやって､ 終わったら何もしないのか､
‫他のことをやるのか｡
‫以上､ Joinとis aliveの基本的な使い方を説明しましたが､ ご理解いただけましたでしょうか？
‫それでは､ 次のビデオでお会いしましょう｡
‫タスクを確認します｡