{ System.out.println("スレッド名="+Thread.currentThread().getName());},threadName);//setメソッド//thread.setName"/> { System.out.println("スレッド名="+Thread.currentThread().getName());},threadName);//setメソッド//thread.setName">

ホームページ  >  記事  >  Java  >  Java スレッドで一般的に使用される操作は何ですか?

Java スレッドで一般的に使用される操作は何ですか?

WBOY
WBOY転載
2023-04-24 11:55:07900ブラウズ

スレッドの共通操作

スレッド名の設定: setName()

スレッド名の取得: getName()

スレッド固有の ID: getId()

// 自定义线程名称
String threadName = "threadName";
// 构造方法方式
Thread thread = new Thread(() -> {
    System.out.println("线程名=" + Thread.currentThread().getName());
},threadName);
// set方法方式
// thread.setName(threadName);
System.out.println("线程唯一Id=" + thread.getId());

スレッド起動: start()

スレッドが生きているかどうかの判定: isAlive()

// 线程启动
thread.start();
System.out.println("是否为存活线程=" + thread.isAlive());

スレッドメソッド: run() /call()

スレッドが開始されると、メソッドが呼び出されます。スレッドがやりたいことは run/call メソッドに記述されており、直接呼び出す必要はなく、スレッドが起動した後に run()/call() を呼び出します。プログラムがスレッドを開始せずに run/call を直接呼び出す場合、そのプログラムはマルチスレッド プログラミングに属しませんが、通常のメソッドを直接呼び出す場合は現在のスレッドに属します。

現在のスレッド オブジェクトを取得します: currentThread()

現在のスレッドの非静的メソッドを操作するには、まずスレッド オブジェクトを取得する必要があります

// 获取当前线程对象
Thread currentThread = Thread.currentThread();
// 对当前线程做一些操作
System.out.println(currentThread.getName());
try {
    // sleep 静态方法则不需要
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

状態についてスレッド(ライフ期間)の制御動作については前回の記事を参照してください。

デーモン スレッド (バックグラウンド スレッド)

通常のスレッド (ユーザー スレッド) の保護者であるデーモン スレッドのタスクは、他のスレッドにサービスを提供することです。プロセス内にユーザー スレッドが存在しない場合、デーモン スレッドは意味を持たず、JVM も終了します。一般的なデーモン スレッドには JVM のガベージ コレクション スレッドが含まれ、オペレーティング システムの起動によりさまざまなモジュールのデーモン スレッドも開始されます。

スレッドをデーモン スレッドとして設定します: setDaeman()

注: このメソッドは start() メソッドの前に呼び出す必要があります

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        System.out.println("线程名="+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 这一句不会打印出来,因为main线程(目前唯一的普通线程)等待1秒后已经结束了
        System.out.println("守护线程的状态=" + Thread.currentThread().getState());
    });
    // 守护线程
    thread.setDaemon(true);
    // 线程启动
    thread.start();
    System.out.println("是否为守护线程=" + thread.isDaemon());
}

スレッドのシリアル化

join() メソッドを実行しているスレッドは、メソッド を呼び出している スレッドが終了するまで ウェイクアップ待機状態 (WAITING) に入り、その後ウェイクアップ待機状態からウェイクアップ待機状態に変わります。実行可能な状態 (RUNNABLE)。 join() メソッドは Thread クラスのメソッドです。最下層は wait() メソッドを使用してスレッドの待機を実現します。スレッド isAlive() が false の場合、

でスレッドのシリアル化を実現します。 : 1 つのスレッドがスレッド オブジェクトの別の Join() を呼び出して、スレッドのシリアル化の実行を実装します。

例: 良い料理

public class DemoCooking {
    
    public static void main(String[] args) {
        Thread mainThread = Thread.currentThread();
        // 1.买菜
        Thread buyThread = new Thread(new CookingThread(mainThread,"买菜"),"buyThread");
        // 2.洗菜
        Thread washThread = new Thread(new CookingThread(buyThread,"洗菜"),"washThread");
        // 3.切菜
        Thread cutThread = new Thread(new CookingThread(washThread,"切菜"),"cutThread");
        // 4.炒菜
        Thread scrambleThread = new Thread(new CookingThread(cutThread,"炒菜"),"scrambleThread");

        // 不受线程启动顺序的影响
        scrambleThread.start();
        washThread.start();
        cutThread.start();
        buyThread.start();
        
        // main线程先执行完才可以开始:买菜
        System.out.println("开始准备……");
    }

    public static class CookingThread implements Runnable{
        private final Thread thread;
        private final String job;

        public CookingThread(Thread thread, String job){
            this.thread = thread;
            this.job = job;
        }
        @Override
        public void run() {
            String name = Thread.currentThread().getName()+":";
            try {
                thread.join();

                System.out.println(name + job + "开始");
                Thread.sleep(1000);
                System.out.println(name + job + "结束");
                Thread.sleep(1000); // 偷懒下
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

実行結果: main > buyThread > washThread >cutThread > scrambleThread > End

Start prepare 。 .. 料理の終了
scrambleThread: 炒め物の開始
scrambleThread: 炒め物の終了


スレッドの優先度

現在のスレッドの優先度を設定します。スレッドの優先順位が高くなるほど、スレッドは実行回数が増えるほど、Java スレッドの優先順位は整数で表されます。優先順位の範囲は 1 ~ 10 で、デフォルトは 5 です。

setPriority(int) メソッド: スレッドの優先順位を設定します。

getPriority メソッド: スレッドの優先度を取得します。

public static void main(String[] args) {

    Thread thread = new Thread(() -> {
        System.out.println("线程1");
    });
    thread.setPriority(10);
    Thread thread1 = new Thread(() -> {
        System.out.println("线程2");
    });
    thread1.setPriority(1);
    thread.start();
    thread1.start();

    System.out.println("线程默认的优先级为=" + Thread.currentThread().getPriority());

}

スレッド割り込み

interrupt() メソッドを使用してスレッド割り込みフラグ = true を設定し、スレッドが「ブロック」されたときに割り込みシグナルがスローされるようにします。スレッドがブロックされている、ウェイクアップを待っている、またはタイムアウト待機状態 (Object.wait、Thread.join、および Thread.sleep) にある場合、スレッドは割り込み例外 (InterruptedException) を受け取り、状態を早期に終了します。一方、スレッドが「RUNNABLE」状態にある場合、割り込みフラグは効果がありません。

ケース 1: スレッドの中断は有効です

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        System.out.println("线程1");
        try {
            // 闹钟1分钟后响
            Thread.sleep(60000);
            System.out.println("闹钟响了");
        } catch (InterruptedException e) {
            // 提前退出超时等待状态
            System.out.println("发生异常,提前醒了,闹钟没响手动关了");
        }

        System.out.println("继续执行该线程的后续程序……");

    });
    thread.setPriority(1);
    thread.start();
    thread.interrupt();
    System.out.println("main线程将thread 终端状态设置为 "+thread.isInterrupted());
}

実行結果:

メイン スレッドはスレッドの終了ステータスを true に設定します

スレッド 1

例外が発生し、早めに目覚め、アラームが鳴らなかったので手動でオフにしました。

スレッドの後続プログラムの実行を続行します... スレッドはステータスを RUNNABLE として出力し続けます。

以上がJava スレッドで一般的に使用される操作は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。