Javaseのマルチスレッド(1)

13882 ワード

マルチスレッド(1)
マルチスレッドの概要
マルチスレッドを理解する前にスレッドを理解する必要がありますが、スレッドはプロセスに依存して存在するので、プロセスを理解します.
プロセスとは
プロセスは実行中のプログラムです.は、システムがリソースの割り当てと呼び出しを行う独立した単位です.各プロセスには、独自のメモリ領域とシステムリソースがあります.
スレッドとは
1つのプロセスで複数のタスクを実行できます.各タスクは、スレッドと見なすことができます.
スレッド:プログラムの実行基本ユニット、実行パス、プログラムがCPUを使用する最も基本的な単位です.
シングルスレッド:プログラムには実行パスが1つしかありません.
マルチスレッド:プログラムには複数の実行パスがあります.
マルチスレッドの意味
マルチスレッドの存在は,プログラムの実行速度を向上させるためではない.プログラムの使用率を高めるためです.
プログラムの実行は実はCPUの資源を奪って、CPUの実行権.
複数のプロセスがCPUリソースを奪っているが、いずれかのプロセスが実行パスが多い場合、CPU実行権を奪う確率も高い.
どのスレッドがいつCPUの実行権を奪うかは保証できないので,スレッドの実行にはランダム性がある.
同時および並列
同時:論理的に同時に発生し、ある時点で複数のプログラムを同時に実行することを指す.(1つのCPUが複数のタスクを同時に実行すると理解できるので、同時と呼ぶ)
パラレル:物理的に同時に発生し、ある時点で複数のプログラムを同時に実行することを指します.(複数のCPUが同時に複数のタスクを実行し、各CPUが1つのタスクのみを実行する場合、これらのプログラムは並列に発生すると理解される)
Javaプログラムの動作原理・
JavaコマンドでJVMを起動すると、JVMの起動はプロセスの起動に相当します.次にメインスレッドを作成し、mainメソッドを呼び出します.
質問:JVM仮想マシンはマルチスレッドですか、シングルスレッドですか.
マルチスレッド.JVMがプライマリ・スレッドを起動する場合、ゴミ回収スレッドも先に起動しなければならないため、メモリオーバーフローの問題が発生するため、JVMが起動すると最低2つのスレッドが起動します.だからJVMはマルチスレッドです.
マルチスレッドを開始する方法
マルチスレッドはプロセスに依存するため、マルチスレッドを実現するにはプロセスを作成する必要があります.プロセスはシステムによって呼び出されるので、まずシステム機能を呼び出してプロセスを作成する必要があります.
Javaはシステム機能を直接呼び出すことはできないので,マルチスレッドプログラムを直接実現することはできない.
しかしJavaはc/c++で書かれたプログラムを呼び出すことでマルチスレッドプログラムを実現し、c/c++でシステム機能作成プロセスを呼び出し、Javaでこれらのものを呼び出し、いくつかのクラスを提供して使用すればマルチスレッドプログラムを実現することができます.
JavaはTheardクラスがマルチスレッドを実装することを提供し,マルチスレッドを実装する方法は2つある.
一.Theardクラスを継承
手順:
​ 1.カスタムクラスはTheardクラスを継承します.
​ 2.カスタムクラスでrun()メソッドを書き換えます.
なぜrun()メソッドを書き換えるのですか?そうではないので、コードはスレッドによって実行されます.Javaは、どのコードがスレッドによって実行される必要があるかを区別するために、Theardクラスのrun()メソッドを提供し、スレッドによって実行されるコードを含みます.
​ 3.オブジェクトを作成します.
​ 4.start()メソッドを呼び出し、スレッドを起動します.
class myTheard extends Thread{
    public myTheard(){}
     public myTheard(String name){
        super(name);
     }

    @Override
    public void run() {
        for (int i = 0;i < 100;i++){
            System.out.println(this.getName()+":"+i);
        }
    }
}

public class theardtest {
    public static void main(String[] args) {
        myTheard my = new myTheard();    
        my.start();
        
        myTheard my2 = new myTheard();       
        my2.start();
    }
}

run()とstart()の違い
run():被スレッド実行コードをカプセル化するだけである.
start():まずスレッドを起動し、JVMによってそのスレッドのrun()メソッドを呼び出す.
スレッドオブジェクト名の設定方法
public final String getName():      。
public final void setName(String name):      

1.オブジェクト呼び出しsetName()メソッドによる変更
 myTheard my = new myTheard();
        my.setName("  1");

2.コンストラクションメソッドの変更親クラスのコンストラクションを呼び出すことでスレッドオブジェクトの名前を変更
class myTheard extends Thread{
    public myTheard(){}
     public myTheard(String name){
        super(name);
     }

    @Override
    public void run() {
        for (int i = 0;i < 100;i++){
            System.out.println(this.getName()+":"+i);
        }
    }
}

public class theardtest {
    public static void main(String[] args) {
        myTheard my = new myTheard("  00001");
        myTheard my1 = new myTheard("  000002");
        my.start();
        my1.start();
    }
}

mainメソッドのスレッド名の取得方法
public static Thread currentThread():                 。
public final String getName():      。
Thread.currentThread().getName()
    
eg:
System.out.println(Thread.currentThread().getName());
out:
main

スレッドスケジューリング
1つのCPUのみの場合、1つのCPUはある時点で1つの命令しか実行できず、スレッドはCPUタイムスライス、すなわち使用権を得てこそ、命令を実行することができる.2つのスケジューリングモデルがあります.
スレッドの2つのスケジューリングモデル
1.タイムシェアリングスケジューリングモデル
すべてのスレッドは交代でCPU使用権を実行し,各スレッドが占有するCPUのタイムスライスを平均的に割り当てる.
2.プリエンプトスケジューリングモデル
優先度の高いスレッドにCPUを使用させ、スレッドの優先度が同じであればランダムに1つ選択します.優先度の高いスレッドはCPUタイムスライスを比較的多く取得する.
Javaでのスレッドスケジューリング
Javaはプリエンプトスケジューリングモデルです.Javaスレッドごとに優先度があります.
Javaスレッドには優先度が設定されていなくても、デフォルトの優先度があります.
Java優先度に関するメソッドは2つあります
public final int getPriority():        。 
public final void setPriority(int newPriority):        。 

に注意
スレッドのデフォルトの優先度は5です.
スレッド優先度の範囲は、1~10です.
スレッドの優先度は、スレッドがCPUタイムスライスを取得する確率が高いことを示すだけであるが、CPUのスケジューリングがランダムであるため、優先度の高いスレッドが先に実行されるとは限らない.すなわち,回数が多い場合や,プログラムを複数回実行してこそ優先度の高い効果が得られる.
スレッドの制御
1.スレッドスリープ
public static void sleep(long millis) throws InterruptedException:                    (    ),                        

このメソッドは、スレッドの操作内で呼び出されます.
スレッドの追加
public final void join() throws InterruptedException:       。

このメソッドを使用するスレッドを実行済みにして、他のスレッドを実行します.
注:このメソッドの呼び出しは、スレッドがオンになった後にあります.
スレッド礼譲
public static void yield():             ,       。

yield()メソッドの役割は,現在のCPUリソースを放棄し,他のタスクにCPU時間を占有させることである.注意:放棄した時間が確定していない場合、CPUタイムスライスはすぐに再取得される可能性があります.複数のスレッドをより調和させますが、1人1回は保証できません.
バックグラウンドスレッド
public final void setDaemon(boolean on):                。               ,Java      。

すなわち,他の非バックグラウンドスレッドの実行が完了すると,バックグラウンドスレッドは自動的に終了する.他のスレッドが生存しているかどうかをisAlive()メソッドで判断します.
スレッドの終了
public final void stop():   。              。    。
public void interrupt():    。