‫お帰りなさい｡
‫このビデオでは､ スレッドについて見ていきます｡ したがって､ スレッドの非常に基本的な概念について､
‫スレッドの作成方法と複数のスレッドを作成する方法を説明します｡
‫では､ さっそくコンソールライトラインを具体的に使ってみましょう｡
‫そこで､ 複数の世界､ 例えば4つの世界を作り､ ハローワールド1､ ハローワールド2､
‫3､ 4と言うことにします｡
‫そのため､ これらのワールドを実行する場合､ まずコンソールの赤線が必要です｡
‫走らせたら､ どうなるかはごく基本的なことです｡
‫つまり､ 画面にHello Worldを4回表示させるだけなのです｡
‫そして､ 私たちはHello Worldです｡
‫1､ 2､ 3､ 4
‫なるほど､ それなら目新しさはないですね｡
‫今まで何度も見てきましたが､ スレッドというものがあり､ スレッドというクラスがあります｡
‫そして､ それを使う場合は､ threading 名前空間を使う必要がある｡
‫だからシステムドットスレッドを使う､ それだけでいいんです｡
‫これでスレッドが使えるようになったわけです｡
‫スレッドクラスを使用すると､ スレッドの作成と制御､ 優先度の設定､ ステータスの取得を行うことができます｡
‫つまり､ 今できることは､ 例えば､ thread dot sleepを限られた時間､ 例えば1000ミリ秒間使うことです｡
‫つまり､ helloworld 1が画面に表示された後､ プログラム全体､
‫あるいはこの場合はメインスレッド､ あるいは1/2用のスレッドを一時停止するのです｡
‫だから､ 決まった時間だけ寝ればいいということにしているんです｡
‫ハローワールド1､ 2､ 3､ 4｡
‫だから､ その中でクリックすると止まってしまうのです｡
‫しかし､ 一般的には1/2を待って､ その1秒後に次のものをプリントアウトしているのがわかると思います｡
‫だから､ それは単にそれが本当に全体のスレッドを停止させるもの｡
‫つまり､ 特定の､ あるいは指定されたミリ秒の間､ 現在のスレッドを一時停止させる｡
‫だからそれは､ 一定時間後に何かしたいときにできることなんです｡
‫でも､ これでは本当に本筋が止まってしまうので､ 注意が必要です｡
‫だから､ UIスレッドで言ってしまえば､ やらなければならないことは何もないのです｡
‫ここではUIを使わず､ コンソールアプリケーションを使用しています｡
‫しかし､ 例えばWPFを使ってUIを持つ場合､ 1/2でメインスレッドを一時停止すると､ 丸1秒間UIが反応しないことになり､
‫それはユーザーが望まないことであり､ やってはいけない非常に悪い動作になるのです｡
‫でも､ それは大体､ ここのスレッドで何ができるかを理解してもらうためですよね？
‫だから､ 特定の時間だけ脅威を与えることができるのです｡
‫しかし､ 私たちは1つのスレッドしか使っていないのです｡
‫本スレッドで､ それについて調べたいなら､ デバッグするしかない｡
‫そして､ そのために､ ここで一点追加します｡
‫デバッグポイントは､ 左のバーを押すだけで､ 例えば9行目のmainメソッドが始まるところです｡
‫そして､ プログラムを起動すると､ ご覧の通り､ ここで一時停止してしまうため､ 何も表示されません｡
‫つまり､ 現在､ カーソルがあるのはそこなんです｡
‫そして､ タスクを見るためには､ デバッグWindowsに移動し､ ここでスレッドを選択する必要があります｡
‫または､ control alt hを押してください｡
‫スレッドを開くと､ ご覧のようにフローティングされているので､
‫ちょうどこの左側に配置します｡
‫そして､ 実行中のスレッドを見ることができます｡ この例では､ メインスレッドだけを見ることができます｡
‫つまり､ スレッドは1つだけで､ マネージドIDは0です｡
‫これがメインスレッドで､ 一般にメインメソッドの中で行われるすべてのことを行っています｡
‫だから､ 次のステップに進むと｡
‫ご覧の通り､ まだメインスレッドで､ 1/2を待ちます｡
‫私たちは､ 世界を実際に開いて見ることができるのです｡
‫見ることができます｡
‫だから､ 今は世界三大物語なんです｡
‫1/2だけ寝て､ 次のステップに行くのを待ちます｡
‫そこで､ F10キーを押して次のステップに進むと､ そのほんの1秒後にhello worldが表示されるのです｡
‫そうです､ 私たちです｡
‫ハローワールド4
‫そして､ この赤い線が出てくる｡
‫だから今､ 私はエンターか何かのようなものを押して､ ここで､ 次のステップに行くつもりです｡
‫そしてご覧の通り､ まだ本スレにいます｡
‫そして､ 私たちのプログラムは閉鎖され､ もうスレッドはありません｡
‫だから､ それはそれでいいんだけど､ 本筋だけだとちょっとつまらないんだよね｡
‫スレッドの作成方法を確認したいので､ そのためにここに来ました｡
‫では､ 自前で複数のスレッドを作ってみましょう｡ ここで起こることは､ 順次行われることです｡
‫だから､ 一歩一歩､ 一列一列と進んでいく｡
‫しかし､ メインスレッドで実行するのではなく､ Parallelに実行したかったので､ 並列に物事を進めたい場合は､
‫独自のスレッドを作成することができます｡
‫そこで､ ここで新しい脅威を作成することにします｡
‫新規と言いながら､ スレッドと言いながら｡
‫だから､ ここではスレッドクラスを使っているだけで､ また括弧と括弧が必要なんです｡
‫そして､ その括弧の後､ 2つ目の括弧､ ここでは等号と大正記号､ 中括弧を使っています｡
‫そして､ ここのブラケットが閉じた後､ スタートする必要があります｡
‫そうやってスレッドを立ち上げるんですね｡
‫で､ 新しいスレッドを作ったら､ Start Hereというので直ぐに始まる｡
‫Startメソッドを実行するだけで､ OSは現在のインスタンスの状態をスレッド状態runningに変更します｡
‫つまり､ このスレッドでは､ このスレッド状態が実行され､ その中括弧の中にあるものは何でも単純に実行されます｡
‫そこで､ このスレッドが呼び出されたときに実行したいコードを追加することができます｡
‫では､ こちらのスレッドが私たちのスレッド1とします｡
‫だから､ スレッド1とかCWスレッド1とか書いて､ その上でちょっと寝るんだよ｡
‫つまり､ 1/2の1000ミリ秒の間スリープする｡
‫このスレはそういうことなんですね｡
‫そして､ これから行うのは､ その下に複数のスレッドを配置することです｡
‫だから､ 1､ 2､ 3､ 4と糸を通す｡
‫そこで､ それらの名前を変更し､ コメントアウトすることにします｡
‫以前からあるもの｡
‫では､ コンソールの右の行､ では実行してみましょう｡
‫そして､ そこに私たちはいます｡
‫ご覧のように､ 一斉に出てきました｡
‫それで1/2を待って､ 全員同時に出てきた｡
‫では､ そこで何が起きていたのか｡
‫ここで実際にそのポイントに､ もしかしたら突っ込ませてください｡
‫そう､ そこです｡
‫では､ もう一度実行してみましょう｡
‫さて､ ここでプログラムが停止していることがわかります｡
‫というところなんですね｡
‫しかし同時に､ このスレッドウィンドウの一番下に､ すでに2つのスレッドが開かれていて､
‫名前のないワーカスレッドと､ 同じく名前のないもう一つのワーカスレッドがあるのがわかると思います｡
‫つまり､ この新しいスレッドがすでに実行されており､ 他のスレッドの1つも同様に開かれているのです｡
‫そして､ 本スレもご覧の通りです｡
‫つまり､ 3つのスレッドが同時に存在するわけです｡
‫では､ 次のステップに進みましょう｡
‫この時点で､ 突然4つのスレッドができ､ その結果､ ここにあるのは4つのスレッドです｡
‫だから､ 1本目が始まると､ たぶん2本目だけはもうできているんだけど､ 他のはまだできていないんです｡
‫そして今､ スレッドが1ミリ秒経過後､ あるいはそれ以下の1000ミリ秒の間スリップしたその時点で､ 他のスレッドがすでに始まっていることがわかります｡
‫つまり､ 4つのスレッドを同時に走らせているわけです｡
‫つまり､ マルチスレッドソリューションがここにあるのです｡
‫そして､ 次のステップを実行すると､ ご覧のように､ スレッド2､ 3､ 4はすでに表示されていますが､ コンソール右側のラインスレッド1はご覧のように､
‫まだ表示されていません｡
‫そのため､ 並行して動作しているのですが､ ご覧のように完璧な精度ではありません｡
‫そのため､ 実行に必要な時間に若干の差が生じることがあります｡
‫そこで､ 次のステップのこの行に進みます｡
‫そして､ 今お見せするように､ スレッド1も終了しました｡
‫だから､ 糸があっても｡
‫あるいは､ ここでの特定の順序で､ 私のコードでは､ 多かれ少なかれ同時に開始されるのです｡
‫そして､ ご覧のように､ 思ったとおり､ 正確な順番である必要はありません｡
‫ですから､ ここに配置した通りの順番で完成するわけではありません｡
‫しかし､ どのようなコードであっても､ どれだけ早く完成させるか､ あるいは実行できるかを基準にしていました｡
‫そのため､ このコードはあのコードより少し長い､ あるいは他のコードよりかなり長い時間が必要ということが起こり得ます｡
‫このように､ スレッドを使って仕事をするためには､ 複数の問題が発生する可能性があるため､
‫非常に慎重にならなければなりません｡
‫そして､ そのうちのいくつかを取り上げて､ お見せしたり､ 差し上げたりしているつもりです｡
‫さらに､ もっと詳しい内容を読むことができるリンクも紹介します｡
‫というわけで､ スレッドの作り方の基本的な考え方はこれくらいにしておきます｡
‫ご覧のように､ そのように設定することができるのです｡
‫つまり､ スレッドとは一般的にちょっとした作業や実行される作業のことで､ プロセッサに複数のコアがあれば､
‫同時に複数のことを実行することができるのです｡
‫つまり､ 4コアのプロセッサーがあるとすると､ 4つのスレッド､ つまり4つのプロセッサーを同時に実行することができるのです｡
‫例えば､ プロセッサが1つしかない場合､ 一度に実行できるのは1つのスレッドまたは1つのタスクだけで､ それを実行することは決して起こらないでしょう｡
‫この1つのプロセッサは､ 一度に1つの特定のことしかしないので､ それらは並行して実行されます｡
‫つまり､ マルチコアプロセッサで動作することがわかっている場合､ あるいはアプリケーションがマルチコアプロセッサで動作することがわかっている場合は､
‫複数のスレッドで動作させることができますが､ そうでない場合は問題に直面することになります｡
‫しかし､ 一般的な仕組みとしては､ コアが1つしかない場合､ メインスレッドが動作し､
‫メインスレッドがアイドル状態のときだけ､ 先に他のことをします｡
‫だから､ 他の脅威を実行することになる｡
‫例えば､ UIがあって､ そのUIにただ物を表示するだけだとします｡
‫ボタンがあるんですね｡
‫そして､ そのボタンにカーソルを合わせると､ 見た目が変わる､ というようなものです｡
‫それは本スレッドで行うものです｡
‫しかし､ メインスレッドがビジー状態でなければ､ 他のスレッドが起動することになります｡
‫では､ バックグラウンドで実行されるべきものがある場合､ メインスレッドであるスレッド1がビジー状態でないとき､
‫あるいはスレッド0でないときに､ それは実行されることになります｡
‫実はここにあるんです｡
‫スレッドについては､ そんな感じですね｡
‫もちろん､ スレッドについてはもう少し詳しく見ていきますが､ 概ね､ 最初にお見せしたかったのはこのようなことです｡