Java(スレッドのライフサイクルおよびスケジューリング)

2897 ワード

一.スレッドライフサイクルスレッドはダイナミックで、一定のライフサイクルを持ち、作成、実行、ブロックから消滅までのプロセスを経験します.各スレッドクラスには、スレッドボディと呼ばれる実際の機能を完了するためのrunメソッドが定義されています.スレッドボディのコンピュータシステムメモリ内の状態によって、スレッドを作成、準備完了、ブロック、死亡の4つの状態に分けることができます.
1.作成ステータスnewキーを使用してスレッドオブジェクトインスタンスを作成すると、オブジェクトインスタンスとしてのみ存在し、JVMはCPUタイムスライスなどのスレッド実行リソースを割り当てていません.2.準備完了ステータス作成中のスレッドでstartメソッドを呼び出し、スレッドのステータスを準備完了ステータス(実行可能ステータスとも呼ばれる)に変換します.このとき,スレッドは既にCPU時間以外のシステムリソースを得ており,JVMのスレッドスケジューラがスレッドの優先度に従ってそのスレッドをスケジューリングするのを待つだけで,そのスレッドにCPUタイムスライスを取得できる機会を与え,そのスレッドがCPUを取得すると運転状態に入る.実行したスレッドはyield()を呼び出してCPUを自動的に放棄し、他のスレッドが実行できるように準備状態に戻ることができる.3.ブロック状態ブロックとは、あるリソースの準備などの条件の発生を待つためにスレッドの実行を一時停止することを意味し、スレッドがブロック状態にある場合、スケジューリングメカニズムはCPU時間を割り当てず、直接スキップする.4.デッドステートスレッドボディの実行が終了するか、スレッドオブジェクトのstopメソッドを呼び出すと、スレッドは実行を終了し、JVMによってスレッドによって占有されたリソースが回収される.
二.スレッドのスケジューリングと優先度スレッドが作成されると、デフォルトの優先度は5です.Javaで比較的特殊なスレッドはデーモン(Daemon)スレッドと呼ばれる低レベルのスレッドである.このスレッドは最も低い優先度を有する.システム内の他のオブジェクトおよびスレッドにサービスを提供するために使用されます.ユーザスレッドをデーモンスレッドに設定する方法は、スレッドオブジェクトが作成される前にスレッドオブジェクトを呼び出すsetDaemon()メソッドです.典型的なデーモンスレッドの例は、システム内のリサイクル可能なリソースをリアルタイムで監視および管理するために常に低レベルの状態で実行されるJVMのシステムリソース自動回収スレッドです.
public class TestThreadPriority extends Thread{
    public TestThreadPriority(String name)
    {
        super(name);
    }
    public static void main(String[] args) {
        TestThreadPriority t1=new TestThreadPriority("Thread1");
        t1.setPriority(MIN_PRIORITY);
        t1.start();
        TestThreadPriority t2=new TestThreadPriority("Thread2");
        t2.setPriority(NORM_PRIORITY);
        t2.start();
        TestThreadPriority t3=new TestThreadPriority("Thread3");
        t3.setPriority(MAX_PRIORITY);
        t3.start();
    }
    public void run()
    {
        for(int i=0;i<3;i++)
            System.out.println(this.getName()+"is running !");
    }   
}


分析:スレッドの実行結果から分かるように、3つのスレッドは優先度に厳格に従ってスケジューリングされ、そのうちスレッド3は起動が遅いにもかかわらず、優先度が最も高いため、実行が完了してから、その2が開始し、最後に1である.