多线程实现的交替打印的多种实现形式

2023-11-16

多线程实现的交替打印的多种实现形式。说白了就是使用java‘中的各种同步器实现这个交替打印的需求。

sync的实现方式

package com.AQS.JiaoTiDaYin;

/**
 * @Author:XK
 * @Date: Created in 12:00 2022/4/20
 * @Description:多线程交替打印的多种实现方法 (sync)
 **/
public class JiaotiDayinSync {
    private static int counter=0;
    private static Object object= new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                int cnt = 0;
                while (cnt<3){
                    synchronized (object){
                        if(counter%3!=0){
                            try {
                                object.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }else {
                            System.out.println("1");
                            cnt++;
                            counter++;
                        }
                        object.notifyAll();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                int cnt = 0;
                while (cnt<3){
                    synchronized (object){
                        if(counter%3!=1){
                            try {
                                object.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }else {
                            System.out.println("2");
                            cnt++;
                            counter++;
                        }
                        object.notifyAll();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                int cnt = 0;
                while (cnt<3){
                    synchronized (object){
                        if(counter%3!=2){
                            try {
                                object.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }else {
                            System.out.println("3");
                            cnt++;
                            counter++;
                        }
                        object.notifyAll();
                    }
                }
            }
        }).start();
    }
}

lock类 ReentrantLock的实现方式

package com.AQS.JiaoTiDaYin;

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

/**
 * @Author:XK
 * @Date: Created in 12:10 2022/4/20
 * @Description:lock实现  ReentrantLock实现
 **/
public class Lock123 {
    private static int state = 0;
    private static Lock lock= new ReentrantLock();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3;) {
                    lock.lock();
                    try {
                        while (state%3==0){
                            System.out.println(1);
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3;) {
                    lock.lock();
                    try {
                        while (state%3==1){
                            System.out.println(2);
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3;) {
                    lock.lock();
                    try {
                        while (state%3==2){
                            System.out.println(3);
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }).start();
    }
}

semaphore信号量实现

package com.AQS.JiaoTiDaYin;

import java.util.concurrent.Semaphore;

/**
 * @Author:XK
 * @Date: Created in 14:41 2022/4/20
 * @Description:
 **/
public class Sema123 {
    private static Semaphore A = new Semaphore(1);
    private static Semaphore B = new Semaphore(0);
    private static Semaphore C = new Semaphore(0);

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    try {
                        A.acquire();
                        System.out.println(1);
                        B.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    try {
                        B.acquire();
                        System.out.println(2);
                        C.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    try {
                        C.acquire();
                        System.out.println(3);
                        A.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程实现的交替打印的多种实现形式 的相关文章

随机推荐

  • GCC的-fomit-frame-pointer编译选项的含义

    GCC的 fomit frame pointer编译选项的含义 优化你的软件时 发觉 fomit frame pointer 这个选项还是蛮有用的 GCC手册上面这么说 Don t keep the frame pointer in a r
  • LVS DR模式负载均衡群集部署

    目录 1 LVS DR 模式的特点 1 1 数据包流向分析 1 2 DR 模式的特点 2 DR模式 LVS负载均衡群集部署 2 1 配置负载调度器 2 1 1 配置虚拟 IP 地址 2 1 2 调整 proc 响应参数 2 1 3 配置负载
  • Linux Top 命令解析

    转自 http www jb51 net LINUXjishu 34604 html TOP是一个动态显示过程 即可以通过用户按键来不断刷新当前状态 如果在前台执行该命令 它将独占前台 直到用户终止该程序为止 比较准确的说 top命令提供了
  • SSM框架实现简单的增删改查

    引言 在中软国际实习的第三天 培训老师要求我们整合出SSM框架实现简单的增删改查 我参考某篇博文链接完成了用户的增删改除 故发此博文以供后来者参考 开发工具 IntelliJ IDEA Ultimate 2018 2 2 Apache to
  • react 更新阶段的生命周期函数

    shouldComponentUpdate nextProps nextState 你可以通过这个方法控制组件是否重新渲染 如果返回 false 组件就不会重新渲染 这个生命周期在 React js 性能优化上非常有用 componentW
  • PyTorch 重磅更新,不只是支持 Windows

    翻译 林椿眄 出品 AI 科技大本营 公众号ID rgznai100 这次版本的主要更新一些性能的优化 包括权衡内存计算 提供 Windows 支持 24个基础分布 变量及数据类型 零维张量 张量变量合并 支持 CuDNN 7 1 加快分布
  • 模型部署之TorchScript

    一 关于torchscript和jit介绍 1 关于torchscript TorchScript是Pytorch模型 继承自nn Module 的中间表示 保存后的torchscript模型可以在像C 这种高性能的环境中运行 TorchS
  • 浏览器定位是如何实现的?为什么会有浏览器定位失败的情况?

    高德地图开放平台JavaScript API提供的Geolocation定位插件 融合了HTML5 Geolocation定位接口 精确IP定位服务 以及安卓定位sdk定位 其中与安卓定位sdk的结合使用适用于开发安卓系统的H5应用 需同时
  • STM32H743必要外围电路分析

    BOOT STM32采用ARM内核 和ARM处理器一样 都有专门的boot脚决定单片机从何处启动 在官方数据手册的第105页 我们可以看到 系统复位后 在SYSTICK的第四个上升沿锁存BOOT引脚的值 复位后 BOOT引脚可以由用户自由配
  • pytorch报错大全

    1 IndentationError unexpected indent 缩进有问题 2 IndexError list index out of range 情况一 list index 中的index下标超出范围了 所以出现了访问越界
  • vs插件,插件大全,插件大全全家桶

    插件大全全家桶 插件大全全家桶 但是本着点赞自愿 收藏吃灰 还是多少可以支持一下
  • Linux服务器搭建Docker

    Linux服务器搭建Docker 一 Docker概述 Docker的出现的原因 二 Docker安装 1 环境准备 2 下载安装 3 阿里云镜像加速 三 Docker命令 1 镜像命令 2 容器命令 四 操作命令 1 生成镜像 commi
  • 2020web前端面试整理

    背景 2020年是比较特殊的一年 由于新冠影响导致很多事情发生了变化 同时也改变了人们的一些常规习惯 就拿换工作来说 为了减少大家的出行和接触 线上视频 电话面试成了趋势 但是万变不离其宗 技术才是王道 下面是个人近期的一些面试经验和需要大
  • 电视系统服务器异常,云电视服务器异常

    云电视服务器异常 内容精选 换一换 云服务器网络异常 防火墙未放行本地远程桌面端口 云服务器CPU负载过高等问题均可能导致云服务器无法正常登录 本节操作介绍无法登录Windows弹性云服务器的排查思路 当您的云服务器无法远程登录时 我们建议
  • Redis学习笔记(一):Redis持久化——RDB与AOF

    引子 前两天晚上下班的时候 和朋友走在路上聊起了Redis的主从复制与哨兵模式 突然觉得自己对这一块的知识还没有一个比较系统化的了解 所以 现在就开始仔细学习一下相关的知识 整理一下Redis相关的知识点 这里做个记录 同时也希望能帮助到大
  • 11月5日 Unreal Engine Rider 代码使用记录

    11月5日的代码使用记录 TSubclassOf UPROPERTY EditAnywhere TSubclassOf
  • C++查漏补缺

    查漏补缺 目录 typedef const与指针 构造函数 使用初始化列表来初始化字段 define条件编译 c 抽象类 C 11新特性之 default C 中std allocator的使用 unique lock mutex auto
  • 软件测试工作中需要使用的工具

    作为一个测试人员在日常工作中会使用到很多的工具 今天给大家分享一下这些工具 对软件测试 接口 自动化 性能测试和日常文档编写办公有帮助的网站 接口测试大力推荐国产的接口测试工具 apipost apipost还是一款很不错的接口文档生产工具
  • Devops学习实践(五)jenkins 与 ant 、findbugs 配合使用

    之前jenkins里面介绍用findbugs主要是采用maven方式 但是很多情况下 工程项目采用的ant进行编译和打包的 通过jenkins ant findbugs结合的方式也是可以进行持续集成的 jenkins 的特点就是能将这些工具
  • 多线程实现的交替打印的多种实现形式

    多线程实现的交替打印的多种实现形式 说白了就是使用java 中的各种同步器实现这个交替打印的需求 sync的实现方式 package com AQS JiaoTiDaYin Author XK Date Created in 12 00 2