Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaスレッドの優先度とは?マルチスレッドにおける優先順位の基本と設定方法

Javaスレッドの優先度とは

マルチスレッド環境では、スレッドスケジューラが各スレッドの優先度に基づいて、どのスレッドにCPUを割り当てるかを決定します。Javaのスレッドにはあらかじめデフォルトの優先度が割り当てられており、JVM(Java仮想マシン)が自動的に設定するほか、プログラマが明示的に指定することも可能です。

スレッドの優先度は、1から10までの整数値(両端を含む)で表されます。優先度に関連する静的変数として、以下の3つが定義されています。

  • MAX_PRIORITY:スレッドに設定できる最大の優先度。デフォルト値は10。
  • NORM_PRIORITY:スレッドの標準的な優先度。デフォルト値は5。
  • MIN_PRIORITY:スレッドに設定できる最小の優先度。デフォルト値は1。

優先度の取得と設定に使うメソッド

getPriority()メソッドを使用すると、対象スレッドに現在設定されている優先度を取得できます。

setPriority()メソッドは、指定したスレッドの優先度を変更します。引数に1未満または10より大きい値を渡した場合、IllegalArgumentExceptionがスローされる点に注意してください。

サンプルコード

import java.lang.*;
public class Demo extends Thread{
    public void run(){
        System.out.println("Now, inside the run method");
    }
    public static void main(String[]args){
        Demo my_thr_1 = new Demo();
        Demo my_thr_2 = new Demo();
        System.out.println("The thread priority of first thread is : " + my_thr_1.getPriority());
        System.out.println("The thread priority of second thread is : " + my_thr_2.getPriority());
        my_thr_1.setPriority(5);
        my_thr_2.setPriority(3);
        System.out.println("The thread priority of first thread is : " + my_thr_1.getPriority());
        System.out.println("The thread priority of second thread is : " + my_thr_2.getPriority());
        System.out.print(Thread.currentThread().getName());
        System.out.println("The thread priority of main thread is : " +
        Thread.currentThread().getPriority());
        Thread.currentThread().setPriority(10);
        System.out.println("The thread priority of main thread is : " +
        Thread.currentThread().getPriority());
    }
}

実行結果

The thread priority of first thread is : 5
The thread priority of second thread is : 5
The thread priority of first thread is : 5
The thread priority of second thread is : 3
mainThe thread priority of main thread is : 5
The thread priority of main thread is : 10

コードの解説

このサンプルでは、Threadクラスを継承したDemoクラスを定義し、runメソッド内でメッセージを出力しています。mainメソッドの中では、まずDemoクラスのインスタンスを2つ生成し、getPriorityメソッドを呼び出してそれぞれの初期優先度を確認しています。

続いて、setPriorityメソッドを使って各スレッドに新しい優先度を設定し、変更後の値をコンソールに出力します。さらに、getNameメソッドで現在実行中のスレッド名を表示するとともに、メインスレッドの優先度についても取得と変更を行っています。

なお、実際の動作では、優先度の高いスレッドが必ずしも先に実行されるとは限りません。優先度はあくまでOSやJVMのスケジューラに対する「ヒント」であり、実行環境によって挙動が異なる場合がある点にも留意しましょう。

  1. Javaでスレッドを停止する方法:stop()メソッドと安全な代替手段を解説

    Javaでは、Threadクラスのstop()メソッドを呼び出すことで、実行中のスレッドを停止させることができます。このメソッドは実行中のスレッドの処理を即座に中断し、待機中のスレッドプールからそのスレッドを取り除いたうえで、ガベージコレクションの対象とします。また、スレッドはrun()メソッドの最後に到達すると、自動的にデッド(終了)状態へ移行します。ただし、stop()メソッドはスレッドセーフ(安全性)の観点で重大な問題を抱えているため、現在のJavaでは非推奨(deprecated)とされています。実際の開発では、本記事の後半で紹介する安全な代替手段の利用が推奨されます。 stop()

  2. Javaのユーザースレッドとデーモンスレッドの違いとは?基本と使い方を解説

    Javaのデーモンスレッドは、主にユーザースレッドに対してバックグラウンドでサービス(補助的な処理)を提供するために使われるスレッドです。アプリケーションのエントリポイントであるmain()メソッドが実行されるメインスレッドは、ユーザースレッド(非デーモンスレッド)です。JVMは、すべてのユーザースレッド(非デーモンスレッド)が終了しない限り、プログラムを終了しません。一方、残っているのがデーモンスレッドだけになった時点で、JVMは即座に終了します。ユーザースレッド内で作成したスレッドをデーモンスレッドとして扱いたい場合は、setDaemon(true)を呼び出して明示的に指定します。なお、こ