昔、とても簡単な、Excel/VBAでのスロットマシンを作ったことがありました。
0〜9までの数字がランダムに表示され続け、ストップボタンを押すと止まる、それが三つ並んでいるだけのシンプルなものです。
その時に、一つ問題に行き当たりました。
ストップボタンを押されるまで数字はランダムに表示され続けるので、そこの処理は無限ループで書きます。
ところが、この無限ループが走っていると、「ボタンが押下された」というイベントを拾ってくれません。
止められないのです。
仕組みとしては、boolean型の変数、stop1,stop2,stop3を作っておき、無限ループに入る前に全てtrueにしておきます。
無限ループの中では三つの数字をバシバシとランダムに表示し続けていますが、常にこの変数がtrueかどうかを見ています。falseになったら書き換えを止めます。
そして三つともfalseになると無限ループを出ます。
ボタンのクリックイベントではこの変数をfalseにするだけ、という目論見でした。
調べると、無限ループの中に、DoEvents という一行を書くだけで、ボタンのクリックイベントを拾ってくれるようになりました。
その時の理解としては、このDoEventsが何者かはわからず、ただ、何かが動き続けている状態で割り込みのように別のアクション、イベントというのですかね、が起きた時に拾ってくれるようにするもの、というだけのものでした。
http://qiita.com/koukisayou/items/3ba742548cb0f4c84eaa
こちらのサイトを手本に、Javaで描画が動き続けるプログラムを書いて見ました。
こんな感じで、赤い四角が動いて行きます。
このプログラムでは、Runnableというインターフェースが使われ、そのインターフェースがimplementsされているクラスの中で、Threadクラスが使われています。
赤い四角を動かし続けるので、当然無限ループが使われています。無限ループが走る前にThreadクラスのstart()メソッドを実行しており、ループの中では同じくThreadクラスの
sleep()メソッドでループの進みを遅くしています。
試しに、Thread関連をみんなコメントアウトしてみると、
そもそもrunメソッド自体が動かなくなりました。
なので最終的な確認は取れていないのですが、このThreadが、VBAでいうところのDoEventsと同じような仕事をしてる、という乱暴な解釈をしておりやす。
スレッドというとシングルだとかマルチだとか、の説明が多いので、なんか難しいのですが、ヒジョーに乱暴に言ってしまえば、ループみたいな継続した処理が行われてる最中に割り込んで別の方角から処理を突っ込める、という解釈で良いではないか、という。
このプログラムでも、キーを押した時のイベントを捉えて、赤い四角の進み方向を逆にしたりしています。
VBAのスロットのストップボタンと同じようなことをしてるんですね。フラグを書き換えてる。
業務システムではあまり出てこないんです。何かを動かし続けるという必要が生まれにくいので。
ゲームの世界だと、これがおそらく必須なのでしょう。
敵が動き続けている中で、こちらも弾を発射したり、相手の弾を避けたりとかというイベントを捉えて動く必要があるので。
で、スレッドとDoEventsは同じだ、という独自解釈に至りました。
あくまで、僕個人の勝手な解釈なので良い子の皆さんはちゃんと学習してくださいね。
実際にはThreadクラスはたくさんのメソッドを持っていて、用途は広いのでしょう。
まだいまいち分かっていないのが、RunnableインターフェースとThreadクラスの関係です。分かっていないけど、めっちゃ深い関係みたいな気がしてるんです。
そこらはまたおいおい。