Thread&Runnable & SwingWorkerの実装方法

SwingGUIの場合、重い処理をさせると画面がフリーズしたようになってしまいます、

そういう処理は必ずスレッドを継承したクラスにしなければなりません、

継承の余地を残すという意味で、一般的にはインターフェースのランナブルの実装が一般的です、

効果はどちらも同じです。

一番簡単な実装で感覚をつかんでください、お作法的書き方を覚えれば簡単です。

Threadの実装方法

最初はThreadの実装方法から

まず下記のようにフレームにラベルとトグルボタンを実装します。

つづいてソース部分ですがトグルボタンのイベントアクションに以下のように書きます。

ブーリアンの宣言はWhileを止めるために設定しています。

スレッドの中のrunメソッドは必ず書かなければいけません、これが無いとスレッドが動作しません。

スレッドはスタートメソッドで動かします、しかし止めるメソッドが廃止になってしまったので、

whileの条件にブーリアンで、トグルボタンを動かしたかどうかのif文で設定しています。

以下のようにトグルボタンを押してラベルにカウント表示されている間もトグルボタンを押して止められればOK

Runnableの実装方法

つぎはRunnableの実装方法です、少しだけThreadとは違います、

書くものが一行増えるだけです。

フレームの実装は上記と同じで中のソースだけ変更します。

以下のようにRunnableはインターフェースなのでimplementsで実装します、

インスタンス生成でオブジェクト生成をフィールドでしている点が違います、

それをトグルのアクションメソッドの中でスレッドのインスタンス生成をしてオブジェクト生成しています。

SwingWorkerの実装方法

次はSwingWorkerの実装方法ですが、上記のスレッドの動作と同じ動きをさせているので、

一番簡単なSwingWorkerの実装方法です。自分もほとんど使ったことが無いです><。

SwingWorkerの場合は必ずジェネリクスを使ってオブジェクトの型を決めなくてはならないようです。

よって今回はInteger型にしていますが、意味は有りません。ちなみにここをString型にしても

Object型にしても動作は変わりません。親クラスのSwingWorkerを継承しているので、

親のdoInBackgroundメソッドをオーバーライドしているため、型の指定がいるみたいです。

void型指定が出来ないためリターンで返さなくてはいけないのですが、返すものが無いのでnullとしています。

スレッドとしてのオブジェクトの作り方はランナブル等といっしょで、実行命令だけ違います。

SwingWorkerの特徴は同期させたいときに簡単に実装出来るらしいです。

自分は同期が絶対必要になるようなコードを書かないのでわかりません、

同期化の実装しなくても、すむならなるべく実装しなくていいコードを書くように考えたほうが、

デッドロックの危険性を回避できるのと、拡張させるときにもバグを生む危険性を、

少しでも減らせると考えています、よってデバッグ作業が少しでも楽になると思いますが....

これら3つともトグルメソッド内部の隠蔽されたスレッドオブジェクトになっています、

他のメソッドなどでも動かしたい場合はフィールドでスレッドのインスタンス生成をした方がいいと思います。

今回は説明のため、メソッド内部で生成しましたが、トグルボタンだけで動かすならばこういう書き方でも

問題ないと思いますが、完璧ではないと思いますのでいろいろなサイトやプロの人のを参考にしてみてください。