Javaマルチスレッドプログラミング学習と思考
仕事の関係で、最近Javaマルチスレッドのプログラミングの資料を見ています。以前はJ 2 EEプロジェクトをしていましたので、マルチスレッドを作成したこともないです。多くの3、4年前にJavaの概念を勉強したのを忘れました。今また拾ってください。
Javaマルチスレッド
Javaスレッドが実行されている状態:
Java仮想マシンはスレッドを実行するプロセスを四つの状態に分けます。
New ----新入生
アンナブル ----実行可能
Blocked ----渋滞
ロード ----あの世に旅立つ
注意:多くのオペレーティングシステムでは、スレッドの状態はこれらの4つにとどまらない。
Javaスレッドの作成:
Javaでマルチスレッドを実現することは、java.lang.Thread類を継承し、java.lang.Runnableインターフェースを実現することによって実現される。
Runnableインターフェースは一つのrunしかないです。
Thread類のサブクラスを継承するには、Thread類のrun()方法をカバーして自分の操作を実現しなければなりません。
スレッドの起動:
Threadクラスのstart()を呼び出すことで、run()メソッドではなくスレッドを起動します。
ルン()法はスレッドの実行体であり、全てのスレッド実行コードはルン()法で実現される。
Runnableインターフェースを実現したスレッドにはstart()方法がなく、以下のように自分を起動させます。
//Runnableインターフェースを実現するスレッドの起動方式Runnable r=new RunnableImpl();Thread thread=new Thread(r)thread.start()
スレッドの優先度:
スレッドの優先度は、そのスレッドを作成するスレッドの優先度と同じです。
スレッドの優先度は以下の方法で設定できます。
//スレッドの優先度を手動で設定します。pblic final void set Priority(int newPriority)
注意:手動設定スレッドの優先度は危険な操作です。具体的なオペレーティングシステムプラットフォームを考慮しなければならない。優先度に対するオペレーティングシステムのサポートが異なるため、windows NT/XPスレッドには7つの優先度があり、多くのLinuxシステムには優先度スケジュールポリシーが設定されていない。したがって、JavaがLinuxに提供する仮想マシンは、優先度の点では完全に無視されている。すべてのスレッドは同じ優先度を持っています。
スレッドの分類:
Javaスレッドは2種類に分けられています。User Thread(ユーザスレッド)、Daemen Thread(守護スレッド)
以下の方法は守護スレッドを設定するためのものです。
//設置スレッドは守護スレッドpublic final void setDaemenである;
注意:set Daemen方法はstart()メソッドの前に設定しなければならない。そうでないと、java.lang.IllagalThreadStateExceptionの異常を投げ出します。
実行中の通常スレッドをデーモンスレッドに設定することはできません。
守護スレッドで発生するスレッドも守護スレッドである。
Thread.sleep()方法
現在のスレッドを一定時間停止させて、他のスレッドにCPU時間を譲ってロックを解除し、運転可能な状態(Runnable状態)に戻して、再度CPU時間を取得して、sleepで実行されていないコードを実行するのを待つ。
wait()の方法
現在実行中のスレッドをブロックし、ロックを解除し、状態をブロック状態にします。
interrupt()方法
実行中のスレッドを中断しますが、実行中のスレッドの中断フラグビットを変更するだけで、実行中のスレッドが中断されるかどうかは自分で決めます。つまり中断する可能性もありますし、終了するまで運行することもあります。
実行中のスレッドは、Thread.currentThread().isInterrupted()によって、スレッドがあるかどうかが自分の運転を中断しようとしているかどうかを判断して、処理を行うかを決めることができます。
public static void yield()の方法
スレッド間通信:
パイプで実現します。パイプラインは名前付きパイプと無名(または匿名)パイプに分けられます。名前付きパイプは、2つの別々のプロセスの間で通信を容易にすることができる。匿名のパイプラインは、親子プロセス間の通信の一つの方法である。
Javaマルチスレッド内のパイプはJavaによって提供されるツールクラスによって実現される。
Javaマルチスレッドの配管工具類:
java.io.PipedInputStream; java.io.PipedOutputStream;
Javaマルチスレッド
Javaスレッドが実行されている状態:
Java仮想マシンはスレッドを実行するプロセスを四つの状態に分けます。
New ----新入生
アンナブル ----実行可能
Blocked ----渋滞
ロード ----あの世に旅立つ
注意:多くのオペレーティングシステムでは、スレッドの状態はこれらの4つにとどまらない。
Javaスレッドの作成:
Javaでマルチスレッドを実現することは、java.lang.Thread類を継承し、java.lang.Runnableインターフェースを実現することによって実現される。
Runnableインターフェースは一つのrunしかないです。
Thread類のサブクラスを継承するには、Thread類のrun()方法をカバーして自分の操作を実現しなければなりません。
スレッドの起動:
Threadクラスのstart()を呼び出すことで、run()メソッドではなくスレッドを起動します。
ルン()法はスレッドの実行体であり、全てのスレッド実行コードはルン()法で実現される。
Runnableインターフェースを実現したスレッドにはstart()方法がなく、以下のように自分を起動させます。
//Runnableインターフェースを実現するスレッドの起動方式Runnable r=new RunnableImpl();Thread thread=new Thread(r)thread.start()
スレッドの優先度:
スレッドの優先度は、そのスレッドを作成するスレッドの優先度と同じです。
スレッドの優先度は以下の方法で設定できます。
//スレッドの優先度を手動で設定します。pblic final void set Priority(int newPriority)
注意:手動設定スレッドの優先度は危険な操作です。具体的なオペレーティングシステムプラットフォームを考慮しなければならない。優先度に対するオペレーティングシステムのサポートが異なるため、windows NT/XPスレッドには7つの優先度があり、多くのLinuxシステムには優先度スケジュールポリシーが設定されていない。したがって、JavaがLinuxに提供する仮想マシンは、優先度の点では完全に無視されている。すべてのスレッドは同じ優先度を持っています。
スレッドの分類:
Javaスレッドは2種類に分けられています。User Thread(ユーザスレッド)、Daemen Thread(守護スレッド)
以下の方法は守護スレッドを設定するためのものです。
//設置スレッドは守護スレッドpublic final void setDaemenである;
注意:set Daemen方法はstart()メソッドの前に設定しなければならない。そうでないと、java.lang.IllagalThreadStateExceptionの異常を投げ出します。
実行中の通常スレッドをデーモンスレッドに設定することはできません。
守護スレッドで発生するスレッドも守護スレッドである。
Thread.sleep()方法
現在のスレッドを一定時間停止させて、他のスレッドにCPU時間を譲ってロックを解除し、運転可能な状態(Runnable状態)に戻して、再度CPU時間を取得して、sleepで実行されていないコードを実行するのを待つ。
wait()の方法
現在実行中のスレッドをブロックし、ロックを解除し、状態をブロック状態にします。
interrupt()方法
実行中のスレッドを中断しますが、実行中のスレッドの中断フラグビットを変更するだけで、実行中のスレッドが中断されるかどうかは自分で決めます。つまり中断する可能性もありますし、終了するまで運行することもあります。
実行中のスレッドは、Thread.currentThread().isInterrupted()によって、スレッドがあるかどうかが自分の運転を中断しようとしているかどうかを判断して、処理を行うかを決めることができます。
public static void yield()の方法
スレッド間通信:
パイプで実現します。パイプラインは名前付きパイプと無名(または匿名)パイプに分けられます。名前付きパイプは、2つの別々のプロセスの間で通信を容易にすることができる。匿名のパイプラインは、親子プロセス間の通信の一つの方法である。
Javaマルチスレッド内のパイプはJavaによって提供されるツールクラスによって実現される。
Javaマルチスレッドの配管工具類:
java.io.PipedInputStream; java.io.PipedOutputStream;