同步模式之顺序控制线程执行

news2024/12/24 8:42:26

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

文章目录

  • 一、同步模式之顺序控制线程执行
  • 二、代码样例
  • 三、三个线程分别输出a、b、c,按顺序输出abcabcabc (大厂机试题)

一、同步模式之顺序控制线程执行

同步模式是指在多线程编程中,为了保证线程之间的协作和正确性,需要对线程的执行顺序进行控制。顺序控制线程执行是一种同步模式,它通过控制线程的等待和唤醒来实现线程的有序执行。

顺序控制线程执行的实现方式很多,其中比较常用的有以下几种:

  1. join()方法:join()方法可以让一个线程等待另一个线程执行完毕后再执行。使用join()方法可以保证线程的有序执行。

  2. wait()和notify()方法:wait()方法可以让一个线程等待另一个线程的通知,而notify()方法可以通知等待的线程继续执行。使用wait()和notify()方法可以实现线程的等待和唤醒,从而实现线程的有序执行。

  3. synchronized关键字:synchronized关键字可以让一个线程独占一个对象,从而实现线程的同步执行。在多个线程访问共享资源时,使用synchronized关键字可以保证线程的有序执行。
    顺序控制线程执行的实现方式不同,适用于不同的场景。在实际开发中,需要根据具体的需求选择合适的实现方式。

二、代码样例

以下是一个简单的 Java 样例代码,用于演示同步模式之顺序控制线程执行的实现方式:

package com.pany.camp.thread.sync;

public class SyncExample {
    public static void main(String[] args) {
        final Object lock = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程1开始执行");
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程1继续执行");
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程2开始执行");
                lock.notify();
                System.out.println("线程2通知线程1继续执行");
            }
        });
        t1.start();
        t2.start();
    }
}

在这里插入图片描述

三、三个线程分别输出a、b、c,按顺序输出abcabcabc (大厂机试题)

package com.pany.camp.thread.sync;

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

public class SyncAbc {

    private static Lock lock = new ReentrantLock();
    private static Condition conditionA = lock.newCondition();
    private static Condition conditionB = lock.newCondition();
    private static Condition conditionC = lock.newCondition();
    private static volatile int count = 0;

    public static void main(String[] args) {
        Thread threadB = new Thread(new PrintTask("b", 1, conditionB, conditionC));
        Thread threadC = new Thread(new PrintTask("c", 2, conditionC, conditionA));
        Thread threadA = new Thread(new PrintTask("a", 0, conditionA, conditionB));
        threadA.start();
        threadB.start();
        threadC.start();
    }

    static class PrintTask implements Runnable {
        private String content;
        private int order;
        private Condition current;
        private Condition next;

        public PrintTask(String content, int order, Condition current, Condition next) {
            this.content = content;
            this.order = order;
            this.current = current;
            this.next = next;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                lock.lock();
                try {
                    while (count % 3 != order) {
                        current.await();
                    }
                    System.out.print(content);
                    count++;
                    next.signal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }
    }
}

在这里插入图片描述
我们使用了 Lock 和 Condition 来实现线程的同步,其中 Lock 用于保证线程的互斥访问,Condition 用于实现线程的等待和唤醒。count 变量用于记录当前应该输出哪个字符,order 变量用于记录当前线程应该输出哪个字符。在每个线程的 run 方法中,首先获取锁,然后判断当前应该输出哪个字符,如果不是当前线程应该输出的字符,则当前线程进入等待状态。如果是当前线程应该输出的字符,则输出该字符,将 count 加 1,并通知下一个线程继续执行。最后释放锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作为一个项目管理成员,怎样才能有效监控项目执行?

作为一个项目管理成员&#xff0c;有效监控项目执行是确保项目成功的关键。在项目执行期间&#xff0c;您需要密切关注项目进展&#xff0c;并及时采取行动来纠正任何偏差。以下是几个有效的方法&#xff0c;可以帮助您监控项目执行并确保项目按计划顺利进行。 1. 制定详细的项…

C语言进阶--数据的存储

目录 数据类型介绍 基本内置类型&#xff1a; 类型的意义&#xff1a; 类型的基本归纳&#xff1a; 整型在内存中的存储 原码&#xff0c;反码和补码&#xff1a; 大小端存储模式&#xff1a; 大小端产生原因&#xff1a; 浮点型在内存中的存储 数据类型介绍 基本内…

六、机械手的种类

机械手是机器人能够完成指令的一个重要输出装置&#xff0c;机器臂是否合理、有效&#xff0c;决定了机 器人能否发挥出应有的作用。 机械手是一种能模仿人手和臂的某些动作功能&#xff0c;用以按固定程序抓取、搬运物件或操作工具的自动操作装置。特点是可以通过编程来完成各…

wy的leetcode刷题记录_Day68

wy的leetcode刷题记录_Day68 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2023-6-6 前言 目录 wy的leetcode刷题记录_Day68声明前言1019. 链表中的下一个更大节点题目介绍思路代码收获 1019. 链表中的下一个更大节点 2352. 相等行列…

CPU、内存、缓存的关系

术语解释 &#xff08;1&#xff09;CPU&#xff08;Central Processing Unit&#xff09; 中央处理器 &#xff08;2&#xff09;内存 内存用于暂时存放CPU中的运算数据&#xff0c;以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁&#xff0c;内存的运行决定…

Docker容器管理

docker容器相当于一个进程&#xff0c;性能接近于原生&#xff0c;几乎没有损耗&#xff1b; docker容器在单台主机上支持的数量成百上千&#xff1b; 容器与容器之间相互隔离&#xff1b; 镜像是创建容器的基础&#xff0c;可以理解镜像为一个压缩包 docker容器的管理 容…

深耕电力行业,百度智能云助力电厂节煤降耗

山西省吕梁市汾阳市三泉镇&#xff0c;晋能集团旗下山西国峰煤电有限责任公司的两台300MW循环流化床直接空冷机组正在运行&#xff0c;燃煤通过传送带进入锅炉燃烧&#xff0c;将水加热成高温高压蒸汽&#xff0c;用以推动汽轮机拖动发电机旋转发电&#xff0c;支撑工业生产、点…

CW32-Template CW32F030开发板工程模板

国产MCU Embedded-CW32-Board-Template Embedded-CW32-Board-Template CW32-Template第三方资源集合 CW-Template CW32开发者开发板资料 CW32-Board 开发板资料 合集 官方提供的案例Examples CW32F030_StandardPeripheralLib\Examples CW32-48F大学计划板例程 EX1流…

优思学院|精益和六西格玛都强调的一件东西...

精益和六西格玛有着诸多不同&#xff0c;它们的方法和理念也不尽相同&#xff0c;但却有一件东西&#xff0c;是他们的共同理念和工具&#xff0c;那就是----标准。 标准&#xff0c;是企业管理中至关重要的一环。标准&#xff0c;不仅指导着我们对人、物和流程的处理方式&…

2023年鄂州中级职称水测考试什么时候考试?

今天鄂州中级职称水测考试开始打印准考证了&#xff0c;但是只能打印部分专业的水测准考证&#xff0c;按照专业&#xff0c;按照批次打印的。 具体通知如下: 各位考生&#xff1a; 为积极稳妥做好我市晋升中、初级专业技术职称综合系列水平能力测试工作&#xff0c;现按专业分…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 37页论文及代码

相关信息 &#xff08;1&#xff09;建模思路 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现 【2023 年第十三届 MathorCup 高校数学建模挑战赛】 B 题 城市轨道交通列车时刻表优化问题 详细建…

2023BR软件、Adobe Bridge下载、安装教程

最后附下载地址 Adobe Bridge CS5 软件是一款功能强大的媒体管理器&#xff0c;它允许您集中访问所有创作资源。 功能介绍 1、可以方便地访问本地PSD、AI、INDD 和 Adobe PDF 文件以及其它 Adobe 和非 Adobe 应用程序文件。 2、可以将资源按照需要拖移到版面中进行预览&…

安卓平台下的即时通讯技术深入解析【实时聊天应用开发实战】

摘要: 本文将详细介绍如何使用安卓开发技术实现一个实时聊天应用。我们将通过构建一个基于安卓平台的聊天应用,演示如何处理用户注册、登录、消息发送和接收等关键功能。文章将涵盖安卓开发的各个方面,包括用户界面设计、后端服务器搭建、网络通信、数据存储和安全性等。读…

spring6

Spring6 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的 开发。从简…

【Mysql数据库从0到1】-入门基础篇--数据库了解

【Mysql数据库从0到1】-入门基础篇--数据库了解 &#x1f53b;一、数据库产生背景&#x1f53b;二、数据库有关概述&#x1f53b;三、数据库访问接口&#x1f53b;四、数据库种类&#x1f53b;五、数据库有关术语&#x1f53b;六、常见DBMS排名&#x1f53b;七、常见数据库介绍…

(三)PUN 2核心内容(待更新)

一、实例化 大多数多人游戏需要创建和同步一些游戏对象。也许它是一个角色、一些单位或怪物&#xff0c;应该出现在房间内的所有客户端上。 PUN 提供了一种方便的方法来做到这一点。 与 Unity 中一样&#xff0c;Instantiate 和 Destroy 用于管理 GameObjects 的生命周期。 PU…

令人惊艳的高效算法盘点(附示例)

令人惊艳的高效算法盘点&#xff08;附示例&#xff09; 在计算机科学领域&#xff0c;算法是解决问题的基石。有些算法&#xff0c;因为其高效性和惊人表现&#xff0c;令人瞩目。本文将为你介绍一些令人惊艳的高效算法&#xff0c;让我们一起来领略这些算法的魅力吧&#xf…

Cesium 热力图

var points []; var width 600; var height 400; var max 100; // 热力图经纬度范围 var latMin 28.364807; var latMax 40.251095; var lonMin 94.389228; var lonMax 108.666357; // 根据热力图图片范围&#xff0c;生成随机热力点和强度值 for (var i 0; i < 30…

淘宝618每日一猜6月6日答案-甄嬛在横店哪里参加的选秀?

淘宝6月6日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月6日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月6日答案分享 活动问题&#xff1a;甄嬛在横店哪里参加的选秀 活动答案&#xff1a;【交泰殿】 还有打开手机淘宝&#xff0c;搜索“能省就…

2.MySQL数据库基础

文章目录 &#x1f4e4;1. 数据库的操作&#x1f4e4;&#x1f431;1.1 查看(显示)当前的数据库&#x1f431;&#x1f436;1.2 创建数据库&#x1f436;&#x1f42d;1.3 使用(选中)数据库&#x1f42d;&#x1f439;1.4 删除数据库&#x1f439; ✉️2. 常用数据类型✉️&…