Java

【OSにも使われている】スレッド

スレッドとは?

Javaのスレッド(thread)とは、プログラム上で複数の処理を同時に動かす仕組みです。

スレッドを利用する理由

JVMは、命令を1つずつ順番に実行します。つまり、ある命令を完全に実行し終えてから次の命令を実行します。複数のJVMがあればネットワーク通信をしながらキーボード入力したり同時に命令を実行できるようになります。そこで、JVMを複数に増やすためのスレッドという仕組みとAPIを用います。

スレッド(プロセス)の状態

New

プロセスが新しく作成された状態
スレッドのインスタンスが生成(new)された状態

Running

命令が実行されれいる

①より優先順位の高いスレッドがきたとき。「実行可能状態」に遷移します。

②wait()、sleep()メソッドが実行されたときや入出力等に伴う処理の遅延が発生したとき、その他、排他制御でロックされているとき「待機状態」に遷移します。

処理が完了したとき「終了」となります。

Waiting

プロセスは何らかのイベントの発生を待っている
例)プロセスは入力が終わるまで次の処理が行えないために入力が終わるまで待っている

Ready

プロセスはプロセッサに割り当てられるのを待っている状態。
スレッドが起動(start)された時この状態になります。JVMのスケジューラがスレッドの優先順位に基づいてスレッドを実行状態に遷移させていきます。

dead/Terminated

プロセスの実行が終了した

スレッドをどのように実装するか

・Thread class を継承する
・Runnable interface を実装する

の2つの方法があります。。。

2つの実装方法に共通したメソッドを以下に示します。

run()

スレッドで実行したい処理をこのrun()メソッドの中に記述します。

start()

ThreadまたはRunnableで実装したクラス型を用いてインスタンスを作成します。その作成したインスタンスのstart()メソッドを用いることでそのスレッドを作成できます。

Thread classを継承する方法

Thread classの方法でスレッドの生成の仕方

Runnable interfaceを実装する方法

Runnable interfaceの方法でスレッドの生成の仕方

Thread classとRunnable interfaceの使いわけ

大きな違いはクラスかインターフェースかです。”Thread”がクラスなのに対し、”Runnable”はインターフェースなので、Threadは多重継承できないのに対し、Interfaceは幾つでもimplementできるのです。

そもそも、”Thread”クラスは”Runnable”を元にしているようなので、通常のスレッドプログラミングでは”Threadクラス”を、Threadの動きそのものを変更したい場合は”Runnable”インターフェースを書き換えることができます。

1 2 3