【并发编程】顺序控制交替输出abc

news2024/11/16 1:43:03

       📝个人主页:五敷有你      
 🔥系列专栏:并发编程
⛺️稳重求进,晒太阳

必须先2后1打印

用synchronized

package aaa;

public class Test2 {
   static Boolean hasExecutor=false;
    public static void main(String[] args) {
        Object obj=new Object();
        new Thread(()->{

            synchronized (obj){
                while (!hasExecutor){
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println(1);
            }
        }).start();

        new Thread(()->{

            synchronized (obj){
               System.out.println(2);
               hasExecutor=true;
               obj.notifyAll();
            }
        }).start();

    }
}

用ReentrantLock

static Boolean hasExecutor=false;
 public static void main(String[] args) {
     ReentrantLock lock=new ReentrantLock();
     Condition condition = lock.newCondition();
     new Thread(()->{
         lock.lock();
         try {
             while (!hasExecutor){
                 condition.await();
             }
             System.out.println(1);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);

         } finally {
             lock.unlock();
         }
     }).start();

     new Thread(()->{
         lock.lock();
         try {

            System.out.println(2);
            hasExecutor=true;
             condition.signalAll();
         }finally {
             lock.unlock();
         }
     }).start();

 }

park && unpark

 


   static Boolean hasExecutor=false;
    public static void main(String[] args) {
        Object obj=new Object();
        Thread t1= new Thread(()->{

                while (!hasExecutor){
                    LockSupport.park();
                }
                System.out.println(1);

        });
        t1.start();

        new Thread(()->{

            synchronized (obj){
               System.out.println(2);
               hasExecutor=true;
                LockSupport.unpark(t1);
            }
        }).start();

    }

交替输出abc

用synchronized

package aaa;

public class Test2 {
    static Boolean hasExecutor = false;

    public static void main(String[] args) {
        WaitNotify waitNotify=new WaitNotify(1);
        new Thread(()->{
            waitNotify.print("a",1,2);
        }).start();
        new Thread(()->{
            waitNotify.print("b",2,3);
        }).start();
        new Thread(()->{
            waitNotify.print("c",3,1);
        }).start();
    }
}

class WaitNotify {
    private Integer flag;
    public String str="a";
   public Integer waitFlag;
   public Integer nextFlag;

    public WaitNotify(Integer flag) {
       this.flag=flag;
    }

    void print(String str, Integer waitFlag, Integer nextFlag) {
        while (true) {
            synchronized (this) {

                while (waitFlag != flag) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.print(str);
                flag=nextFlag;
                this.notifyAll();
            }
        }
    }

}

用reentrantLock()实现

  • lock.lock()对应synchronized
  • condition.await对应wait()
  • condition.signalAll 对应 notifyAll
void printLock(String str, Integer waitFlag, Integer nextFlag) {
    while (true) {
       reentrantLock.lock();
        try {
            while (waitFlag != flag) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.print(str);
            flag=nextFlag;
            condition.signalAll();

        }finally {
            reentrantLock.unlock();
        }
    }
}

用park&unpark

park不需要while()来判断是否虚假唤醒,因为它指定某个线程唤醒

void printPark(String str,Thread t){
    while (true) {


        LockSupport.park();
        System.out.print(str);
        flag = nextFlag;
        LockSupport.unpark(t);
    }

}

结合 线程状态思考

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

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

相关文章

TS基础知识点快速回顾(上)

基础介绍 什么是 TypeScript? TypeScript,简称 ts,是微软开发的一种静态的编程语言,它是 JavaScript 的超集。 那么它有什么特别之处呢? js 有的 ts 都有,所有js 代码都可以在 ts 里面运行。ts 支持类型支持&#…

华清远见作业第三十三天——C++(第二天)

思维导图: 题目: 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数…

优思学院|如何将AI人工智能融入精益六西格玛?

在当前的制造和服务运营中,许多流程都在一定程度上重复进行,这为实验、学习和持续改进其底层流程提供了机会。直到最近,这些流程的改进大多由人类专家执行。然而,随着包括生成型AI在内的人工智能工具的出现,这一切都在…

阅读go语言工具源码系列之gopacket(谷歌出品)----第一集 DLL的go封装

gopacket项目是google出品的golang第三方库,项目源码地址google/gopacket: Provides packet processing capabilities for Go (github.com) gopacket核心是对经典的抓包工具libpcap(linux平台)和npcap(windows平台)的go封装,提供了更方便的go语言操作接…

JavaScript DOM之Cookie详解

cookie有的地方习惯使用复数形式的cookies,指的是网站为了识别用户的身份或者进行一些必要数据的缓存而使用的技术,它的数据是存在用户的终端上,也就是在浏览器上的。 一、什么是cookie 随着互联网的不断发展各种基于互联网的服务系统逐渐多…

3D点云数据的标定,从搭建环境到点云标定方法及过程,只要有一台Windows笔记本,让你学会点云标定

ptscloudpre: 点云标定准备: 说明: 如下介绍适用windows系统的电脑。apple笔记本同理,但是需要安装MAC版本的anaconda。网址:Free Download | Anaconda可下载对应MAC版本的Anaconda的安装包建议下载2022年或2021年的安装包安装。…

nginx限制ip访问

先看一下被禁止的效果 如何配置 禁止访问的话直接在location模块增加类似如下配置 deny all; 完整示例 location / {deny all;root html;index index.html index.htm;} 默认是allow all就是允许所有ip访问,如果只配置指定ip可以访问是无效的,还是所有的ip可以访问 无效示例…

【UAT阶段】测试计划分享

前面我有分享UAT阶段注意事项,今天跟大家分享UAT测试计划包含哪些内容: 希望该计划能给大家在实际项目中有所帮助;

k8s图形化管理工具之rancher

前言 在前面的k8s基础学习中,我们学习了各种资源的搭配运用,以及命令行,声明式文件创建。这些都是为了k8s管理员体会k8s的框架,内容基础。在真正的生产环境中,大部分的公司还是会选用图形化管理工具来管理k8s集群,大大提高工作效率。 在二进制搭建k8集群时,我们就知道了…

java web 研究生信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web研究生信息管理系统是一套完善的java web信息管理系统 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库为My…

【MySQL故障】主从延迟越来越大

问题背景 研发执行了一个批量更新数据的操作,操作的表是个宽表,大概有90多个字段,数据量有800多w,但是研发是根据ID按行更新。更新开始后,该集群的主从延迟越来越大。 问题现象 1 从库应用binlog基本无落后&#xf…

【腾讯云服务器】幻兽帕鲁私服服务器部署保姆级教程

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或分解后食用。 想要部署属于自…

IDEA常用插件(本人常用,不全)

文章目录 一、图标提示类插件1、Lombok插件(用户配合lombok依赖的工具)2、MybatisX插件3、GitToolBox4、VUE.js5、ESLint 二、代码自动生成插件1、EasyCode插件:自动生成代码神器2、GsonFormat 三、常用工具类1、IDE Eval Reset 插件&#xf…

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所…

python小项目:口令保管箱

代码&#xff1a; #! python3 # python 编程-----口令保管箱passwords{emails: F7minlBDDuvMJuxESSKHFhTxFtjVB6,blog:VmALvQyKAxiVH5G8v01if1MLZF3sdt,luggage:12345,} import sys,pyperclip if len(sys.argv)<2:print(usage:python python3文件[accout]-copy accout pass…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1&#xff09;产品和大模型的区别&#xff08;产品通过调用大模型来具备的能力&#xff09; 2&#xff09;AGI定义 概念&#xff1a;一切问题可以用AI解决 3&#xff09;大模型通俗原理 根据上文&#xff0c;猜测下…

100.乐理基础-五线谱-是否需要学习五线谱

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;99.乐理基础-简谱的多声部-CSDN博客 简谱与五线谱的区别&#xff0c;各自的优劣势、使用场景、范围等&#xff1a; 要搞懂这个问题&#xff0c;其实核心就是四个词&#xff1a;首调、固定调、单声部、多声部 首调、…

github ssh ssh-keygen

生成和使用 SSH 密钥对是一种安全的身份验证方式&#xff0c;用于在你的本地系统和 GitHub 之间进行身份验证。以下是在 GitHub 上生成和使用 SSH 密钥对的基本步骤&#xff1a; 1. 生成 SSH 密钥对 在命令行中执行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -C &q…

计算机速成课Crash Course - 23. 屏幕 2D 图形显示

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 23. 屏幕& 2D 图形显示 (qq.com) 23. 屏幕& 2D 图形显示 这台…

YOLOv5改进系列(28)——添加DSConv注意力卷积(ICCV 2023|用于管状结构分割的动态蛇形卷积)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制