国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

線程按順序循環(huán)執(zhí)行

這篇具有很好參考價值的文章主要介紹了線程按順序循環(huán)執(zhí)行。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

假設(shè)有3個線程,依次打印A、B、C,按順序循環(huán)打印100次。
這個其實(shí)是線程通信,如果只是按順序執(zhí)行,用只有一個線程的線程池,依次提交線程任務(wù)就行,但是這里還不是每個線程只執(zhí)行一次,需要循環(huán)重復(fù)打印。
這里有兩種處理方式,一種是搞個全局int變量,對線程數(shù)取模,得到0~2,再轉(zhuǎn)ASCII碼。一種是3個線程按照創(chuàng)建時的順序嚴(yán)格執(zhí)行。

第一種思路寫法:
這里只用到了原生的阻塞喚醒方法,線程競爭獲取鎖,確保同時只有一個線程累加countIndex和打印,3個線程的執(zhí)行順序就不是創(chuàng)建的順序,而是隨機(jī)的。

public class ThreeThreadPrintOrderlyBySync {

    private static final Object LOCK = new Object();
    private static volatile int countIndex = 0;
    private static final int MAX = 100;
    private static final int WORKER_COUNT = 3;

    public static void main(String[] args) {
        Thread thread1 = new Thread(new Worker(0));
        Thread thread2 = new Thread(new Worker(1));
        Thread thread3 = new Thread(new Worker(2));
        thread1.start();
        thread2.start();
        thread3.start();
    }

    public static class Worker implements Runnable {
        private final int index;

        public Worker(int index) {
            this.index = index;
        }

        @Override
        public void run() {
            while (countIndex < MAX) {
                synchronized (LOCK) {
                    try {
                        if (countIndex % WORKER_COUNT != index) {
                            LOCK.wait();
                        }
                        if (countIndex <= MAX) {
                            System.out.printf(String.valueOf((char) (65 + countIndex % WORKER_COUNT)));
                        }
                        countIndex++;
                        LOCK.notifyAll();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

第二種處理方式:
通過線程序號控制ReentrantLock中Condition的阻塞喚醒文章來源地址http://www.zghlxwxcb.cn/news/detail-759701.html

public class ThreeThreadPrint {
    private static final int WORKER_COUNT = 3;
    private static final ReentrantLock LOCK = new ReentrantLock();
    private static int countIndex = 0;

    public static void main(String[] args) {
        List<Condition> conditions = new ArrayList<>();
        for (int i = 0; i < WORKER_COUNT; i++) {
            Condition condition = LOCK.newCondition();
            conditions.add(condition);
            Thread thread = new Worker(i, conditions);
            thread.start();
        }
    }

    public static class Worker extends Thread {
        private int index;
        private List<Condition> conditions;

        public Worker(int index, List<Condition> conditions) {
            super("Thread" + index);
            this.index = index;
            this.conditions = conditions;
        }

        @Override
        public void run() {
            while (true) {
                LOCK.lock();
                try {
                    if (countIndex % WORKER_COUNT != index) {
                        conditions.get(index).await();
                    }
                    if (countIndex > 100) {
                        conditions.get((index + 1) % conditions.size()).signal();
                        return;
                    }
                    System.out.printf(String.valueOf((char) (65 + countIndex % 3)));
                    countIndex++;
                    conditions.get((index + 1) % conditions.size()).signal();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } finally {
                    LOCK.unlock();
                }
            }
        }
    }
}

到了這里,關(guān)于線程按順序循環(huán)執(zhí)行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java中代碼的執(zhí)行順序

    注意 只有顯式的加載類 JVM才會加載到內(nèi)存中 先加載父類的靜態(tài)代碼塊 然后執(zhí)行子類靜態(tài)代碼塊 當(dāng)前類存在類靜態(tài)變量 注意引用類型沒進(jìn)行賦值操作初始化為null 并不會顯式的加載類 又存在靜態(tài)代碼塊 會先執(zhí)行前者進(jìn)行初始化 再執(zhí)行靜態(tài)代碼塊 在實(shí)例化類的時候 執(zhí)行順序

    2023年04月23日
    瀏覽(22)
  • 關(guān)于Java中代碼的執(zhí)行順序

    注意 只有顯式的加載類 JVM才會加載到內(nèi)存中 先加載父類的靜態(tài)代碼塊 然后執(zhí)行子類靜態(tài)代碼塊 當(dāng)前類存在類靜態(tài)變量 注意引用類型沒進(jìn)行賦值操作初始化為null 并不會顯式的加載類 又存在靜態(tài)代碼塊 會先執(zhí)行前者進(jìn)行初始化 再執(zhí)行靜態(tài)代碼塊 在實(shí)例化類的時候 執(zhí)行順序

    2023年04月23日
    瀏覽(14)
  • Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計差異

    Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計差異

    在多線程項(xiàng)目開發(fā)時,最常用、最常遇到的問題是 1,線程、協(xié)程安全 2,線程、協(xié)程間的通信和控制 本文主要探討不同開發(fā)語言go、java、python在進(jìn)程、線程和協(xié)程上的設(shè)計和開發(fā)方式的異同。 進(jìn)程 進(jìn)程是 操作系統(tǒng)進(jìn)行資源分配的基本單位,每個進(jìn)程都有自己的獨(dú)立內(nèi)存空

    2024年01月23日
    瀏覽(21)
  • JAVA多線程處理for循環(huán)數(shù)據(jù)

    JAVA多線程處理for循環(huán)數(shù)據(jù)

    對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程與子線程無先后順序 執(zhí)行結(jié)果: 對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程在所有子線程執(zhí)行完成之后執(zhí)行 執(zhí)行結(jié)果: 對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程在所有子線程執(zhí)行完成之后執(zhí)行 執(zhí)行結(jié)果: 4. JAVA多線程10個線程處理100

    2024年02月11日
    瀏覽(27)
  • 【Java高級應(yīng)用:深入探索Java編程的強(qiáng)大功能,JVM 類加載機(jī)制, JVM 內(nèi)存模型,垃圾回收機(jī)制,JVM 字節(jié)碼執(zhí)行,異常處理機(jī)制】

    本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發(fā)王大師,專注于天道酬勤的 Java 開發(fā)問題 中國國學(xué)、傳統(tǒng)文化和代碼愛好者的程序人生,期待你的關(guān)注和支持!本人外號:神秘小峯 山峯 轉(zhuǎn)載說明:務(wù)必注明來源(注明:作者:

    2024年01月16日
    瀏覽(27)
  • 【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機(jī)制

    【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機(jī)制

    JVM,就是Java虛擬機(jī),Java的的程序都是運(yùn)行在JVM當(dāng)中。 程序在執(zhí)行之前先要把java源代碼轉(zhuǎn)換成字節(jié)碼(class文件),JVM 首先需要把字節(jié)碼通過一定的方(類加載器(ClassLoader)) 把文件加載到內(nèi)存中的運(yùn)行時數(shù)據(jù)區(qū)(Runtime Data Area) ,而字節(jié)碼文件是 JVM 的一套指令集規(guī)范,并

    2024年02月16日
    瀏覽(23)
  • c++中 多線程執(zhí)行時 線程的執(zhí)行順序不固定

    ????????C++中多線程執(zhí)行時,線程的執(zhí)行順序是不確定的。這是由于 多線程的并發(fā)性質(zhì) 導(dǎo)致的。 ????????在多線程程序中,多個線程可以同時執(zhí)行,并且它們的執(zhí)行順序是由系統(tǒng)調(diào)度器決定的。系統(tǒng)調(diào)度器根據(jù)各種因素(如線程的優(yōu)先級、線程的狀態(tài)等)來決定何時

    2024年02月08日
    瀏覽(21)
  • java八股文面試[多線程]——并發(fā)三大特性 原子 可見 順序

    java八股文面試[多線程]——并發(fā)三大特性 原子 可見 順序

    ? ? AutomicInteger :? volatile + CAS 總線LOCK? MESI 兩個協(xié)議 TODO volatile的可見性和禁止重排序是怎么實(shí)現(xiàn)的: DCL場景:? new操作會在字節(jié)碼層面生成兩個步驟: 分配內(nèi)存、調(diào)用構(gòu)造器 然后把引用賦值給singleton 不加volatile則會發(fā)生指令重排,可能得到不完整的對象 知識來源: 【并

    2024年02月11日
    瀏覽(25)
  • 深入探討Java虛擬機(jī)(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機(jī)制

    深入探討Java虛擬機(jī)(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機(jī)制

    目錄 什么是JVM? JVM 執(zhí)行流程 JVM 運(yùn)行時數(shù)據(jù)區(qū) 堆(線程共享) Java虛擬機(jī)棧(線程私有) 什么是線程私有? 程序計數(shù)器(線程私有) 方法區(qū)(線程共享) JDK 1.8 元空間的變化 運(yùn)行時常量池 內(nèi)存布局中的異常問題 1.? Java堆溢出 2.??虛擬機(jī)棧和本地方法棧溢出 JVM 類加載 1.

    2024年02月09日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包