【マルチスレッド】マルチスレッドノートを認識する

4957 ワード

【マルチスレッド】マルチスレッドノートを認識する
この章の目的:
プロセスとスレッドの違いを理解する
Javaスレッドの2つの実装方法と違いを把握する
スレッドの動作状態の理解
3.1プロセスとスレッド
スレッドは実際にはプロセス基盤上のさらなる区分であり,WORDからスペルチェックを1つのスレッドとして扱うことができる.もちろん、複数のスレッドが同時に存在します.
プロセスがなくなった場合、スレッドは必ず消えます.スレッドが消えた場合、プロセスは必ずしも消えるとは限りません.また,プロセスがスレッドに基づいて同時(同時実行)であるスレッドもある.
3.2 Javaのマルチスレッド実装
Javaでマルチスレッドを実装するには、次の2つの方法があります.
3.2.1 Threadクラス
Threadクラスの継承
Threadクラスはjavaです.langパッケージで定義されているクラスは、Threadクラスが継承されている限り、マルチスレッドクラスと呼ばれます.Threadサブクラスではrun()メソッドを明示的に上書きする必要があり,このメソッドはスレッドの主体である.
構文の定義:
クラス名extends Thread{
属性;
方法;
//スレッドの主体であるThreadクラスのrun()メソッドの上書き
    public void run(){
スレッド本体;
    }
}
例1:
class MyThread extends Thread{    // Thread , 
    private String name;    // 
    public MyThread(String name){
        this.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.run();
        mt2.run();    
    }
}

以上のコードは,Aを先に実行してからBを実行するものであり,いわゆる同時実行の効果は得られない.
以上のプログラムは実際には古い形式で呼び出されるため,オブジェクトメソッドを介しているが,スレッドを起動するにはThreadクラスで定義されたstart()メソッドを使用しなければならない.
start()メソッドを呼び出すと、実際に最終的に呼び出されるのがrun()メソッドです.
class MyThread extends Thread{    // Thread , 
    private String name;    // 
    public MyThread(String name){
        this.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();    
    }
}

3.2.2 Runnableインタフェース
Runnableインタフェースの実装
JavaではRunnableインタフェースを実装することによってマルチスレッドを実装することもでき、Runnableインタフェースでは抽象的な方法が1つしか定義されていません.
public void run();
Runnableインタフェースによるマルチスレッド化:
クラス名implements Runnable{
属性;
方法;
    public void run(){
スレッド本体;
    }
}
例2:
class MyThread implements Runnable{
    private String name;
    public MyThread(String name){
        this.name = name;    
    }
    public void 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 t2 = new Thread(mt2);
        t1.start();
        t2.start();
    }


}

3.3、ThreadクラスとRunnableインタフェース
3.3.1、ThreadクラスとRunnableインタフェースの連絡
定義形式から,ThreadクラスもRunnableインタフェースのサブクラスであることが分かる.
ThreadクラスとRunnableインタフェースの連絡
Threadクラスの定義:
public class Thread extends Object implements Runnable
このアプローチはエージェント・モードによく似ています
3.3.2、ThreadクラスとRunnableインタフェースの違い
Runnableを使用すると、リソース共有の役割を果たすことができます.
class MyThread extends Thread{
    private int ticket = 5;
    public void run(){
        for(int i=0;i<100;i++){
            if(this.ticket>0){
                System.out.println(" :ticket = "+ticket);            
            }        
        }
    }
}
public class ThreadDemo04{
    public static void main(String args[]){
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        MyThread mt3 = new MyThread();
        mt1.start();
        mt2.start();
        mt3.start();
    }
}
class MyThread implements Runnable{
    private int ticket = 5;
    public void run(){
        for(int i=0;i<100;i++){
            if(this.ticket>0){
                System.out.println(" :ticket = "+ticket);            
            }
        }    
    }
}
public class RunnableDemo02{
    public static void main(String args[]){
        MyThread mt1 = new MyThread();    // Runnable 
        Thread t1 = new Thread(mt1);
        Thread t2 = new Thread(mt1);
        Thraed t3 = new Thread(mt1);
        t1.start();
        t2.start();
        t3.start();
    }
}

3.3.3、ThreadクラスとRunnableインタフェースの使用結論
Runnabelインタフェースを実装することは、Threadクラスを継承することよりも明らかな利点があります.
同じリソースを複数の同じプログラムコードで処理するのに適しています.
単一継承の限界による影響を回避
プログラムの堅牢性が向上し、コードは複数のスレッドで共有でき、コードとデータは独立しています.
3.4、スレッドの状態
マルチスレッドは、オペレーションにおいても一定のオペレーション状態を有します.
作成ステータス:マルチスレッドのオブジェクトが用意されています:Thread t=new Thread()
準備完了ステータス:start()メソッドを呼び出し、cpuのスケジューリングを待つ
運転状態:run()メソッドの実行
≪ブロック・ステータス|Blocking Status|emdw≫:実行を一時停止し、他のスレッドにリソースを渡す可能性があります.
終了ステータス(デッドステータス):スレッドが実行され、使用されなくなりました.