Javaマルチスレッドの実現方式とライフサイクル
2623 ワード
Javaのスレッドの実現方式
1.Runnableインターフェースを実現する
スレッドは通常5つの状態を持ち、それぞれ作成、準備、運転、ブロック、終了です。各状態は以下のように説明します。作成状態 プログラムでは、スレッドオブジェクトを構造的に作成した後、新しいスレッドオブジェクトが新規に作成されています。このとき、メモリ空間と他のリソースが既にありますが、まだ実行できない状態です。新しいスレッドオブジェクトは、例えば「Thread thread=new Thread()」のようなThread類の構造方法で実現することができます。レディ状態 スレッドオブジェクトを新規作成したら、スレッドのstart()を呼び出すとスレッドが起動します。スレッドが起動すると、スレッドは準備完了状態になります。この時、スレッドはスレッド列に入り、CPUサービスを待っています。これは、実行条件がすでに備わっていることを示しています。運転状態 準備完了状態が呼び出されてプロセッサリソースが得られると、スレッドは実行状態に入ります。この時、スレッドオブジェクトのrun()を自動的に呼び出します。run()方法は、このスレッドの動作と機能を定義する。遮断状態 実行中のスレッドは、特定の場合には、人が保留されたり、時間がかかる入出力操作を行うと、CPUに自分の実行を一時停止させて、ブロック状態になります。実行可能な状態で、sleep()、suspend()、wait()を呼び出すと、スレッドがブロック状態になり、ブロックが発生した時にスレッドが列に入ることができなくなり、渋滞の原因が解消された時にのみ、スレッドが準備状態に移行することができます。死亡状態 スレッドがstop()を呼び出した場合、またはrun()メソッドの実行が終了した後、すなわち死亡状態となります。死亡した状態のスレッドは動作を継続する能力がない。
スレッド同期
一つのマルチスレッドプログラムがRunnableによって実現されると、クラス内の属性は複数のスレッドで共有され、複数スレッドが同じリソースを操作すると、リソース同期問題が発生する可能性がある。
解決方法:
1.同期コードブロック
1.Runnableインターフェースを実現する
class MyThread implements Runnable{
private String name ; //
public MyThread(String name){
this.name = name ; // name
}
public void run(){ // run() ,
for(int i=0;i<10;i++){
System.out.println(name + " ,i = " + i) ;
}
}
};
public class RunnableDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread(" A ") ; //
MyThread mt2 = new MyThread(" B ") ; //
Thread t1 = new Thread(mt1) ; // Thread
Thread t2 = new Thread(mt2) ; // Thread
t1.start() ; //
t2.start() ; //
}
};
2.Thread類の継承
class MyThread extends Thread{
private String name ; //
public MyThread(String name){
this.name = name ; // name
}
public void run(){ // run() ,
for(int i=0;i<10;i++){
System.out.println(name + " ,i = " + i) ;
}
}
};
public class ThreadDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread(" A ") ; //
MyThread mt2 = new MyThread(" B ") ; //
mt1.start() ; //
mt2.start() ; //
}
};
スレッドの5状態スレッドは通常5つの状態を持ち、それぞれ作成、準備、運転、ブロック、終了です。各状態は以下のように説明します。
スレッド同期
一つのマルチスレッドプログラムがRunnableによって実現されると、クラス内の属性は複数のスレッドで共有され、複数スレッドが同じリソースを操作すると、リソース同期問題が発生する可能性がある。
解決方法:
1.同期コードブロック
synchronized( ){
}
2.同期方法synchronized ( ){
}