スレッドの優先度
アプリケーションでスレッドをスケジュールする場合、最も直接的な方法はスレッドの優先順位を設定することです。優先度の高いスレッドはCPU実行を取得する可能性が高く、優先度の低いスレッドはCPU実行を取得する可能性が低くなります。スレッドの優先度は、1から10までの整数で表されます。数値が大きいほど、優先度が高くなります。表に示すように、数値を直接使用してスレッドの優先順位を示すことに加えて、Threadクラスで提供される3つの静的定数を使用してスレッドの優先順位を示すこともできます。
スレッド静的定数 | 関数の説明 |
---|---|
static int MAX_PRIORITY | スレッドの最高の優先度を表します。これは値10に相当します。 |
static int MIN_PRIORITY | スレッドの最低優先度を表し、値1に相当します |
static int NORM_PRIORIY | スレッドの通常の優先度を表し、値5に相当します |
プログラムの実行中、準備完了状態の各スレッドには独自の優先順位があります。たとえば、メインスレッドには通常の優先順位があります。ただし、スレッドの優先度は固定されておらず、ThreadクラスのsetPriority(int newPriority)メソッドで設定できます。このメソッドのパラメーターnewPriorityは、Threadクラスの1〜10または3つの静的定数の整数を受け取ります。次に、例に示すように、ケースを使用して、プログラム内で優先度の異なる2つのスレッドの操作を示します。
package 多线程;
// 定义类MaxPriority实现Runnable接口
class MaxPriority implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "正在输出:" + i);
}
}
}
// 定义类MinPriority实现Runnable接口
class MinPriority implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "正在输出:" + i);
}
}
}
class Example07 {
public static void main(String[] args) {
// 创建两个线程
Thread minPriority = new Thread(new MinPriority(), "优先级较低的线程");
Thread maxPriority = new Thread(new MaxPriority(), "优先级较高的线程");
minPriority.setPriority(Thread.MIN_PRIORITY); // 设置线程的优先级为1
maxPriority.setPriority(10); // 设置线程的优先级为10
// 开启两个线程
maxPriority.start();
minPriority.start();
}
}
Javaは10のスレッド優先度を提供しますが、これらの優先度にはオペレーティングシステムのサポートが必要であることに注意してください。オペレーティングシステムが異なれば、サポートの優先度も異なり、Javaのスレッド優先度との相性はあまり良くありません。1対1の対応。したがって、マルチスレッドアプリケーションを設計する場合、その機能の実現はスレッドの優先度に依存してはなりませんが、スレッドの優先度はプログラムの効率を向上させる手段としてのみ使用できます。
スレッドの譲歩
スレッドの譲歩は、yield()メソッドを介して実現できます。このメソッドはsleep()メソッドに似ています。どちらも、現在実行中のスレッドを一時停止できます。違いは、yield()メソッドがスレッドをブロックせず、変換するだけであるということです。スレッドの準備ができました。状態を確認し、システムスケジューラに再度スケジュールを設定させます。(次のスケジューリングが同じ優先度のスレッドである場合、ランダムにスケジュールされます。)スレッドがyield()メソッドを呼び出すと、現在のスレッドと同じかそれ以上の優先度を持つスレッドのみが実行の機会を得ることができます。次に、ケースを使用して、yield()メソッドの使用法を示します。
// 定义YieldThread类继承Thread类
class YieldThread extends Thread {
// 定义一个有参的构造方法
public YieldThread(String name) {
super(name); // 调用父类的构造方法
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "---" + i);
if (i == 3) {
System.out.print("线程让步:");
Thread.yield(); // 线程运行到此,作出让步
}
}
}
}
public class Example09 {
public static void main(String[] args) {
// 创建两个线程
Thread t1 = new YieldThread("线程A");
Thread t2 = new YieldThread("线程B");
// 开启两个线程
t1.start();
t2.start();
}
}
スレッドジャンプ
実生活では、「キューをジャンプする」という状況に遭遇することがよくあります。同様に、この「関数」を実現するために、join()メソッドもThreadクラスで提供されます。別のスレッドのjoin()メソッドがスレッドで呼び出されると、呼び出し元のスレッドはブロックされ、join()メソッドによって追加されたスレッドの実行が完了するまで実行され続けません。
public class Example10{
public static void main(String[] args) throws Exception {
// 创建线程
Thread t = new Thread(new EmergencyThread(),"线程一");
t.start(); // 开启线程
for (int i = 1; i < 6; i++) {
System.out.println(Thread.currentThread().getName()+"输入:"+i);
if (i == 2) {
t.join(); // 调用join()方法
}
Thread.sleep(500); // 线程休眠500毫秒
}
}
}
class EmergencyThread implements Runnable {
public void run() {
for (int i = 1; i < 6; i++) {
System.out.println(Thread.currentThread().getName()+"输入:"+i);
try {
Thread.sleep(500); // 线程休眠500毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}