Java マルチスレッドに関連して一般的に使用されるメソッドの概要 (スレッド停止、スレッド スリープ、スレッド ポライトネス、スレッド優先度、デーモン スレッドなど)

1. スレッド方式

setPriority(int newPriority)      更改线程的优先级
static void sleep(long millis)    在指定的毫秒数内让当前正在执行的线程休眠
void join()                       等待该线程终止
static void yield()               暂停当前正在执行的线程对象,并执行其他线程
void interrupt()                  中断线程,别用这个方式
boolean isAlive()                 测试线程是否处于活动状态

次に、スレッドが停止します

1. アイデア

JDK が提供する stop( ) および destroy( ) メソッドを使用することは推奨されません。
スレッド自体を停止し、フラグ ビットを使用して変数を終了することをお勧めします。flag = false の場合、スレッドは終了します。

2. サンプル

package com.example.multithreading.demo5;

//1、建议线程正常停止 ----> 利用次数,不建议死循环
//2、建议使用标志位 ----> 设置一个标志位
//3、不要使用stop或者destroy等过时,或者JDK不建议使用的方法
public class StopTest implements Runnable {
    
    

    // 1、设置一个标识位
    private boolean flag = true;

    @Override
    public void run() {
    
    
        int i = 0;
        while (flag) {
    
    
            System.out.println("run Thread " + i++);
        }
    }

    // 2、设置一个公开的方法停止线程,转换标志位
    public void stop() {
    
    
        this.flag = false;
    }

    public static void main(String[] args) {
    
    
        StopTest stopTest = new StopTest();

        new Thread(stopTest).start();

        for (int i = 0; i < 100; i++){
    
    
            System.out.println("i: " + i);
            if (i == 90){
    
    
                // 调用stop方法切换标志位,让线程停止
                stopTest.stop();
                System.out.println("线程该停止了");
            }
        }
    }
}

結果
ここに画像の説明を挿入

3. スレッドスリープ(スリープ)

1. アイデア

sleep (時間) は、現在のスレッドがブロックするミリ秒数を指定します。Sleep には、
InterruptedException という例外があります。
スリープ時間が経過すると、スレッドは準備完了状態になります。sleep は、
ネットワーク遅延、カウントダウンなどをシミュレートできます。
各オブジェクトにはロックがあります。 、スリープしてもロックは解除されません。

2. サンプル

package com.example.multithreading.demo6;

import java.text.SimpleDateFormat;
import java.util.Date;

// 模拟倒计时
public class SleepTest {
    
    

    public static void main(String[] args) {
    
    
        // 打印当前系统时间
        // 获取系统当前时间
        Date startTime = new Date(System.currentTimeMillis());

        while(true) {
    
    
            try {
    
    
//            tenDown();
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                // 更新当前时间
                startTime = new Date(System.currentTimeMillis());
            } catch (Exception e) {
    
    
                e.printStackTrace();
            }
        }
    }

    // 模拟倒计时
    public static void tenDown() throws InterruptedException{
    
    
        int num = 10;

        while(true){
    
    
            Thread.sleep(1000);
            System.out.println(num--);
            if(num<=0){
    
    
                break;
            }
        }
    }

}

結果
ここに画像の説明を挿入

4、糸のご厚意(譲り)

1. アイデア

ポライトスレッド、現在実行中のスレッドを一時停止させますが、ブロックはしません
スレッドを実行状態から準備完了状態にします
ポライトネスにより CPU のスケジュールが変更されますが、必ずしも成功するとは限りません。

2. サンプル

package com.example.multithreading.demo7;

// 测试礼让线程
// 礼让不一定成功
public class YieldTest {
    
    

    public static void main(String[] args) {
    
    
        MyYield myYield = new MyYield();
        new Thread(myYield, "a").start();
        new Thread(myYield, "b").start();

    }
}

class MyYield implements Runnable{
    
    
    @Override
    public void run() {
    
    
        System.out.println(Thread.currentThread().getName() + "线程开始执行");
        // 礼让
        Thread.yield();
        System.out.println(Thread.currentThread().getName() + "线程停止执行");
    }
}

結果
ここに画像の説明を挿入

5. スレッドの強制(結合)

1. アイデア

join はスレッドをマージし、このスレッドが実行された後、他のスレッドが実行され、他のスレッドはブロックされます。

2. サンプル

package com.example.multithreading.demo8;

public class JoinTest implements Runnable {
    
    
    @Override
    public void run() {
    
    
        for (int i = 0; i < 5; i++) {
    
    
            System.out.println("线程join进来:" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
    
    
        JoinTest joinTest = new JoinTest();
        Thread thread = new Thread(joinTest);
        thread.start();

        // 主线程
        for (int i = 0; i < 15; i++) {
    
    
            if(i==5){
    
    
                // 插队
                thread.join();
            }
            System.out.println("主线程:" + i);
        }
    }
}

結果
ここに画像の説明を挿入

6. スレッドのステータスを観察する

1. 関連概念

スレッドは、特定の時点で 1 つの状態になることができます。これらの状態は、オペレーティング システムの状態を反映しない仮想マシンの状態です。

// 线程状态
NEW
尚未启动的线程处于此状态
RUNNABLE
在Java虚拟机中执行的线程处于此状态
BLOCKED
被阻塞等待监视器锁定的线程处于此状态
WAITING
正在等待另一个线程执行特定动作的线程处于此状态
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
TERMINATED
已退出的线程处于此状态

2. サンプル

package com.example.multithreading.demo9;

// 观察测试线程的状态
public class StateTest {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    
        Thread thread = new Thread(() -> {
    
    
            for (int i = 0; i < 2; i++){
    
    
                try{
    
    
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
    
    
                   e.printStackTrace();
                }
            }
            System.out.println("/");
        });

        // 观察状态
        Thread.State state = thread.getState();
        System.out.println(state);

        // 观察启动后
        thread.start();
        // 启动线程
        state = thread.getState();
        System.out.println(state);

        // 只要线程不终止,就一直输出状态
        while (state != Thread.State.TERMINATED){
    
    
            Thread.sleep(100);
            // 更新线程状态
            state = thread.getState();
            // 输出状态
            System.out.println(state);
        }
    }
}

結果
ここに画像の説明を挿入

7、スレッドの優先順位

1. プロセス

Java には、プログラム起動後に実行可能状態になったすべてのスレッドを監視するスレッド スケジューラがあり、優先度に応じてどのスレッドを実行するかを決定します。
スレッドの優先順位は 1 ~ 10 の数値で表されます
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
優先順位を変更または取得するには、次のメソッドを使用します
getPriority() .setPriority(int xxx )
優先度が低いということは、スケジューリングを取得する確率が低いというだけであり、優先度が低いと呼び出されないということではありません (CPU のスケジューリングに依存します)。

2. サンプル

package com.example.multithreading.demo10;

// 测试线程的优先级
public class PriorityTest {
    
    

    public static void main(String[] args) {
    
    
        // 主线程默认优先级
        System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());

        Priority priority = new Priority();

        Thread t1 = new Thread(priority);
        Thread t2 = new Thread(priority);
        Thread t3 = new Thread(priority);
        Thread t4 = new Thread(priority);
        Thread t5 = new Thread(priority);
        Thread t6 = new Thread(priority);

        // 先设置优先级,再启动
        t1.start();

        t2.setPriority(1);
        t2.start();

        t3.setPriority(4);
        t3.start();

        t4.setPriority(Thread.MAX_PRIORITY);
        t4.start();

        t5.setPriority(8);
        t5.start();

        t6.setPriority(7);
        t6.start();
    }
}

class Priority implements Runnable{
    
    

    @Override
    public void run() {
    
    
        System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());
    }
}

結果
ここに画像の説明を挿入

8、デーモンスレッド

1.コンセプト

スレッドはユーザー スレッドとデーモン スレッドに分割されます。
仮想マシンはユーザー スレッドの実行が完了することを確認する必要があります。
仮想マシンはデーモン スレッドの実行が完了するまで待つ必要はありません。

2. サンプル

package com.example.multithreading.demo11_Daemon;

public class DaemonTest {
    
    

    public static void main(String[] args) {
    
    
        God god = new God();
        People people = new People();

        Thread thread = new Thread(god);
        // 默认是false表示是用户线程,现在为true,表示是守护线程
        thread.setDaemon(true);

        // 守护线程启动
        thread.start();

        // 用户线程启动
        new Thread(people).start();

    }
}

class God implements Runnable{
    
    

    @Override
    public void run() {
    
    
        while (true) {
    
    
            System.out.println("守护线程!!!");
        }
    }
}

class People implements Runnable{
    
    

    @Override
    public void run() {
    
    
        for (int i = 0; i < 10; i++){
    
    
            System.out.println("主线程!!!");
        }
        System.out.println("GoodBye World");
    }
}

結果
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_46106857/article/details/128181887