溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現一個多線程

發布時間:2021-09-13 11:34:54 來源:億速云 閱讀:164 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何實現一個多線程,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

傳統線程測試:* 子線程循環10次,接著主線程循環100次,接著又回到子線程循環10次,接著再回到主線程又循環100次,如此循環50次,請寫出程序。

 一、傳統方法(隱式鎖)實現

package com.lau.javabase.lock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 傳統線程測試:
 * 子線程循環10次,接著主線程循環100次,接著又回到子線程循環10次,接著再回到主線程又循環100次,如此循環50次,請寫出程序。
 */
public class TraditionThreadExerciseTest {
    volatile Boolean executeInTurn = true;

    public synchronized void subTask(int times) throws Exception {
        while(!executeInTurn){
            this.wait();
        }

        for(int i = 1; i <= 10; i++){
            System.out.println("子任務內部運行第" + i + "次," + "總第" + times + "次");
        }

        executeInTurn = false;

        this.notify();
    }

    public synchronized void mainTask(int times) throws Exception {
        while(executeInTurn){
            this.wait();
        }

        for(int i = 1; i <= 100; i++){
            System.out.println("主任務內部運行第" + i + "次," + "總第" + times + "次");
        }

        executeInTurn = true;
        this.notify();
    }

    /**
     * @Description:特別注意:不能將主線程和子線程循環50次的調用寫在一個for循環里,
     * 因為這樣會導致后面的跑到前面去,引發錯序打印問題
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        TraditionThreadExerciseTest test = new TraditionThreadExerciseTest();

        ExecutorService threadPool = Executors.newFixedThreadPool(4);

        threadPool.submit(() -> {
            try {
                for(int i = 1; i <= 50; i++) {
                    test.subTask(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "subThread");

        threadPool.submit(() -> {
            try {
                for(int i = 1; i <= 50; i++) {
                    test.mainTask(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "mainThread");

        threadPool.shutdown();
    }
}

二、顯示鎖實現

package com.lau.javabase.lock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 傳統線程測試:
 * 子線程循環10次,接著主線程循環100次,接著又回到子線程循環10次,接著再回到主線程又循環100次,如此循環50次,請寫出程序。
 */
public class TraditionThreadLockTest {
    volatile Boolean executeInTurn = true;

    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

    public void subTask(int times) throws Exception {
        try{
            lock.lock();

            while(!executeInTurn){
                condition.await();
            }

            for(int i = 1; i <= 10; i++){
                System.out.println("子任務內部運行第" + i + "次," + "總第" + times + "次");
            }

            executeInTurn = false;

            condition.signal();
        }
        finally {
            lock.unlock();
        }
    }

    public void mainTask(int times) throws Exception {
        try{
            lock.lock();

            while(executeInTurn){
                condition.await();
            }

            for(int i = 1; i <= 100; i++){
                System.out.println("主任務內部運行第" + i + "次," + "總第" + times + "次");
            }

            executeInTurn = true;
            condition.signal();
        }
        finally {
            lock.unlock();
        }
    }

    /**
     * @Description:特別注意:不能將主線程和子線程循環50次的調用寫在一個for循環里,
     * 因為這樣會導致后面的跑到前面去,引發錯序打印問題
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        TraditionThreadLockTest test = new TraditionThreadLockTest();

        ExecutorService threadPool = Executors.newFixedThreadPool(4);

        threadPool.submit(() -> {
            try {
                for(int i = 1; i <= 50; i++) {
                    test.subTask(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "subThread");

        threadPool.submit(() -> {
            try {
                for(int i = 1; i <= 50; i++) {
                    test.mainTask(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "mainThread");

        threadPool.shutdown();
    }
}

上述內容就是如何實現一個多線程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女