循环交替执行多线程任务-Java

多线程轮流交替执行三种实现方法 第一种方法:采用公平锁实现 思路及其简单: A线程拿到锁,执行代码 B线程拿到锁,执行代码 A线程拿到锁,执行代码 ...... public class FairLockDemo { public static void main(String[] args) { Runnable target = new Runnable(){ int i = 10; // 利用公平锁 private R 阅读详情

1、循环打印-version1

/**
 * @author xin麒
 * @date 2023/7/21 23:04
 * 验证,如果有错,那么ctrl+f搜索false肯定会搜索到的!
 */
class XinTask{
    private final static Object lock = new Object();
    private int flag = 0;
    private int time;

    public XinTask(int time) {
        this.time = time;
    }

    public void print(int signal,int printTarget) {

        for (int i = 0; i < time; i++) {
            synchronized (lock){
                while (flag != signal){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(flag + " printTarget == flag ? " + (printTarget == flag));
                flag = (flag + 1) % 3;
                lock.notifyAll();
            }
        }
    }
}

public class Main {
    static private XinTask xinTask = new XinTask(10000);
    public static void main(String[] args) {

        new Thread(()->{
            xinTask.print(0,0);
        },"task0").start();

        new Thread(()->{
            xinTask.print(1,1);
        },"task1").start();

        new Thread(()->{
            xinTask.print(2,2);
        },"task2").start();

    }
}

2、循环打印-version2

/**
 * @author xin麒
 * @date 2023/7/21 23:04
 * 验证,如果有错,那么再控制台终端ctrl+f搜索false肯定会搜索到的!
 */
class XinTask {
    private int flag = 0;
    private int time;
    int queueNumber;

    public XinTask(int queueNumber) {//如果是走这个构造方法,那么则执行一遍
        this.queueNumber = queueNumber;
        time = 1;
    }

    public XinTask(int time, int queueNumber) {//如果是走这个构造方法,那么则循环time次
        this.time = time;
        this.queueNumber = queueNumber;
    }

    public void print(String targetStr, int signal) {

        for (int i = 0; i < time; i++) {
            synchronized (this) {
                while (flag != signal) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("targetStr is " + targetStr + " ,flag is " + flag + " , signal == flag ? " + (signal == flag));
                flag = (flag + 1) % queueNumber;
                this.notifyAll();
            }
        }
    }
}

public class Main {
    static final int queueNumber = 3;
    private static final int time = 10000;
    static private XinTask xinTask = new XinTask(time, queueNumber);//只能循环执行queueNumber个线程的内容。按照线程创建且实例化的顺序来执行

    public static void main(String[] args) {
        new Thread(() -> {
            xinTask.print("a", 0);
        }, "task0").start();//实例化第一个线程

        new Thread(() -> {
            xinTask.print("b", 1);
        }, "task1").start();//实例化第2个线程

        new Thread(() -> {
            xinTask.print("c", 2);
        }, "task2").start();//实例化第3个线程

    }

    @Test
    public void test() {
        ArrayList<String> list = new ArrayList<>(queueNumber);
        list.add("a");
        list.add("b");
        list.add("c");
        printTargetStringByThreads(list);
    }

    private void printTargetStringByThreads(ArrayList<String> list) {//按照list里面的节点的顺序打印节点里存储的数据
        ArrayList<Thread> threads = new ArrayList<>(queueNumber);
        for (int i = 0; i < queueNumber; i++) {
            int order = i;
            Thread t = new Thread(() -> {
                xinTask.print(list.get(order) + "", order);
            }, "task" + order);
            t.start();
            threads.add(t);
        }

        threads.forEach((t) -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
}

3、最终版本

import org.junit.Test;

import java.util.ArrayList;

/**
 * @author xin麒
 * @date 2023/7/21 23:04
 */
class XinTask {
    private int flag = 0;
    private int time;

    public XinTask() {
        time = 1;
    }

    public XinTask(int time) {//如果是走这个构造方法,那么则循环time次
        this.time = time;
    }

    public void print(String targetStr, int signal, int queueNumber) {

        for (int i = 0; i < time; i++) {
            synchronized (this) {
                while (flag != signal) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("targetStr is " + targetStr);//如果不需要其他提示也可以改成:
//                System.out.print( targetStr);
                flag = (flag + 1) % queueNumber;
                this.notifyAll();
            }
        }
    }

    public void printTargetStringByThreadsWithJoin(ArrayList<String> list) {//按照list里面的节点的顺序打印节点里存储的数据
        if (list == null) return;
        ArrayList<Thread> threads = new ArrayList<>(list.size());
        for (int i = 0; i < list.size(); i++) {
            int order = i;
            Thread t = new Thread(() -> {
                print(list.get(order), order, list.size());
            }, "task" + order);
            t.start();
            threads.add(t);
        }

        threads.forEach((t) -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
}

public class Main {
    private static final int time = 10000;
    static private XinTask xinTask = new XinTask(time);//只能循环执行queueNumber个线程的内容。按照线程创建且实例化的顺序来执行

    public static void main(String[] args) {
        new Thread(() -> {
            xinTask.print("a", 0, 3);
        }, "task0").start();//实例化第一个线程

        new Thread(() -> {
            xinTask.print("b", 1, 3);
        }, "task1").start();//实例化第2个线程

        new Thread(() -> {
            xinTask.print("c", 2, 3);
        }, "task2").start();//实例化第3个线程

    }

    @Test
    public void test() {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        XinTask xinTask = new XinTask(10000);
        xinTask.printTargetStringByThreadsWithJoin(list);//按照list节点数据的存放顺序来打印
    }

}

Java 多个线程交替执行 Java 多个线程交替执行 - 小白入门教程 阅读详情

相关推荐

中国全国地面站点数据(1981-2010)、月平均气象、月平均降水、月平均相对湿度、月最大降水、月最高温度最低温度、月最高温平均值最低温平均值、高低温站点基础数据,气候数据

中国全国地面站点数据(1981-2010)、月平均气象、月平均降水、月平均相对湿度、月最大降水、月最高温度最低温度、月最高温平均值最低温平均值、高低温站点基础数据 b_china_mon_avg_data_pressure月平均气象 b_china_mon_avg_data_rain月平均降水 b_china_mon_avg_data_rhu月平均相对湿度 b_china_mon_max_data_rain月最大降水 b_china_mon_max_min_data_tem月最高温度最低温度 b_china

无极低码 2万+

java多线程 线程交替执行(同步)的各种实现方案

如果想要指定执行顺序,则需要用信号量,或者自己实现一个标志位去模拟信号量如果不需要指定执行顺序,则谁先竞争到锁就谁先执行,执行完后唤醒另一个线程,再进入wait状态。

qq_43800449的博客 2903

comfyui中的k采样器报错Given groups=1, weight of size [320, 4, 3, 3], expected input[2, 8, 96, 54] to have 4

求助大佬!!!我运行comfyui的时候,k采样器变紫,同时报错显示:

M1226401728的博客 5181

多线程-线程锁-while循环

今天写多线程遇到了几个问题,导致程序一直无法正常运行: 多个线程共用一个函数的时候,,由于没有用线程锁,导致无法正常运行; 函数中有while循环,加入多线程之后,,由于没有进行初始化互斥量,导致只有第一个线程起作用。 下面是例子: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #in...

qq_40443457的博客 4272

抖音自定义卡片链接(图文链接)

抖音自定义可以自定义标题,打开链接,和展示图片 效果 主要代码 public void sendMessage(String conversationId, Object aBaseContent) throws Exception { // C233282u5.LIZIZ.LIZ().LIZIZ(LIZ).LIZ(obtain).LIZ(hLn).LIZ((AbstractC59811HHc) new H9Q()); Object HOa = ReflectionUtil

傅恒的博客 4140

MacOS新手必看:HomeBrew安装避坑指南(含M1芯片适配方案)

本文为MacOS新手提供全面的HomeBrew安装指南,特别包含M1/M2芯片适配方案。从系统准备到核心安装流程,再到日常维护和高级配置,详细解析每个步骤的潜在问题及解决方案,帮助用户高效管理Mac软件。

weixin_28831399的博客 471

【多线程】线程交替执行

【代码】【多线程】线程交替执行。

王佑辉的博客 321

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 365

Java多线程的交替执行

读完Think In Java的多线程,深有感悟,花了1个小时,写了一个多线程交替执行程序,大家可以参考,如有好的意见,请提出,谢谢! package com.thread; public class ThreadTest implements Runnable { public void run() { int j = 0; while (true) { ...

longhua2014的专栏 220

OpenTK简介

OpenTK 因其强大的功能、跨平台特性和灵活性,适用于多种需要图形和计算能力的应用场景,为开发者提供了丰富的可能性和创作空间。

仰望星空的博客 1980

RK356X linux系统移植RTL8723BU模块遇到的坑

RK356X linux系统移植RTL8723BU模块遇到的坑

目前从事linux驱动开发,多交流多学习吧 955

子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 ...

public class ThreadTest { /** * 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 */ public static void main(String[] args) { // TODO Auto-generated meth...

lvwenwen 255

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3325

java 异步线程写法_多线程_几种定时器的写法

1 :固定时间后执行一次任务:1000毫秒后执行任务(只执行一次)2: 5000毫秒后,执行任务,以后每隔1000毫秒再执行一次任务(无限执行)3:交替再生:任务2秒4秒交替的执行(无限执行),4: 创建两个循环交替任务:2秒后,A任务执行。 A任务里面创建一个B任务4秒后执行,B任务里面又创建一个A任务2秒后执行,如此往复。1,2,3代码:import java.util.Date;import...

weixin_28950543的博客 694

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多线程顺序执行多次,分别使用synchronized、ReentrantLock、CyclicBarrier、Semaphore实现

分为两种: 1. 只执行一次 2. 执行多次 多次执行的方法: 多线程编程时,需要特别注意以下几点: 线程会存在并行执行的情况,如果不干预肯定是不行的,所以,需要借助一些手段,才能达到线程顺序执行的目的。 最主要的是借助共享资源(共享变量)来实现。 像ReentrantLock、CyclicBarrier、CountDown都是通过对共享变量进行操作的。 在操作时,每个线程都需要清楚,是应该继续执行,还是说睡眠(等待),等待被唤醒, 清楚等待的条件和唤醒后继节点的条件,这几点...

qq_35634181的博客 935

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python的多线程问题

python 版本原因**用C、C++或Java来改写相同的死循环,直接可以把全部核心跑满,4核就跑到400%,8核就跑到800%,为什么Python不行呢?因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。

qq_40872385的博客 480

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。

java多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。 public class TestMain {          public static void main(String[] args) {         new TestMain().init();              }  ...

zhangf_1234的博客 985

java多线程的一道面试题

题目如下:        子线程循环10次,然后主线程循环100次。如此往返,循环50次。   package TreaditionThread; public class TreadtionnalThreadMian { /** * @param args */ public static void main(String[] args) { // T...

qq117361093的专栏 113

《黑马程序员》Lock&Condition练习

public class ConditionCommuncationTest3 { /** * 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, * 接着再回到主线程又循环100,如此循环50次,请写出程序。 * 假设我们这里有三个线程。即两个子线程一个主线程 */ public static void main(String[] args) { f

青云志,我心不死,必度青天... 580

多线程编程入门(6):一道线程同步与通信面试题

package cn.itcast.heima2; /* * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又回到主线程又循环100次, * 如此循环50次。请写出程序 * */ public class TraditionalThreadCommunication { public static void main(String[] args) {

592

Java多线程与并发应用-(4)-传统线程通信技术试题

package com.lipeng; public class LoopDemo { /** * 线程A循环10次,然后线程B循环100次,然后A再循环10次,然后B再循环100次。如此循环50次。 * lipeng * 2015-4-10 * @param args */ public static void main(String[] args) { MyTa

lp1137917045的专栏 861

java中实现一句话100次循环_java多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。...

java多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。public class TestMain {public static void main(String[] args) {new TestMain().init();}private void init(){final ThreadTask t...

weixin_39582569的博客 459

循环打印ABC

i

weixin_44836762的博客 232

多线程中主线程与子线程执行的顺序

在我们刚刚接触多线程时,所练习的Demo可能会达不到我们期待的运行结果,这其实有两种可能: 第一,是巧合,CPU可能是一直执行完一个线程再去执行另一个线程。所以我们看到的结果一直是没有交替执行的。 解决办法是:把运行的次数放大,10次不行就100次,100次不行就1000次,1000次不行5000次,其实1000次的时候也就差不多出现了交替运行。 //线程任务类 public class Th...

Maspue的博客 1万+

面试题:同步锁

/** * 子线程循环30次,主线程循环40次,再子线程循环30次,主线程循环40次,一共循环50轮 * @author zhangsong * */ public class ThreadDemo { private static SonThread thread = new SonThread(); public static void main(String[] args) {

646

传统线程互斥技术----实现

//子线程循环10次,接着主线程循环100次,接着在子线程循环10次,接着再主线程循环100次 public class SynTest { public static void main(String[] args) { final Business b = new Business(); new Thread(new Runnable() { public void run()

hao947的专栏 875
上一篇: 5_2-点赞功能-结合(多线程)or(多线程兼异步)定时持久化到数据库-应用redis的scan方法
下一篇: Java子类可以继承父类的所有属性吗
xin麒
博客等级 码龄6年 110粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值