首页 > 其他分享 >交替打印0-100

交替打印0-100

时间:2023-08-21 16:33:51浏览次数:36  
标签:Thread ++ 打印 交替 static Semaphore new 100

synchronized

package juc;

public class Print100 {
    private static volatile int nums = 0;

    private static final  Object lock = new Object();

    public static void main(String[] args) {
        Thread threadA = new Thread(()->{
            for (int i = 0; i < 100; i++) {
                // 获得锁
                synchronized (lock){
                    while (nums%2!=0){
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName()+"  nums: "+nums++);
                    lock.notifyAll();
                }
            }
        });


        Thread threadB = new Thread(()->{
            for (int i = 0; i < 100; i++) {
                synchronized (lock){
                    while (nums%2!=1){
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName()+"  nums: "+nums++);
                    lock.notifyAll();
                }

            }
        });

        threadA.start();
        threadB.start();
    }
}

Semaphore 实现

import java.util.concurrent.Semaphore;

public class PrintABC {
    private static int state = 0;

    // 三个信号量对象,分别表示A、B、C三个线程的初始许可数
    private static final Semaphore A = new Semaphore(1);
    private static final Semaphore B = new Semaphore(0);
    private static final Semaphore C = new Semaphore(0);

    public static void main(String[] args) {
        // 创建三个线程
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 循环100次
                    for (int i = 0; i < 100; i++) {
                        // 获取许可
                        A.acquire();
                        // 打印字母
                        System.out.println("A");
                        // 修改状态
                        state++;
                        // 释放许可
                        B.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 100; i++) {
                        B.acquire();
                        System.out.println("B");
                        state++;
                        C.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread threadC = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 100; i++) {
                        C.acquire();
                        System.out.println("C");
                        state++;
                        A.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // 启动三个线程
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

参考:https://juejin.cn/post/7252912234221387837?searchId=202308211040093299373C80F65B7FBFF0

标签:Thread,++,打印,交替,static,Semaphore,new,100
From: https://www.cnblogs.com/chenyi502/p/17646388.html

相关文章

  • 为啥网线都会限制传输距离为100米?
    下午好,我的网工朋友。大部分网工都经历过网络布线这件事儿吧。无论是五类双绞线,还是六类双绞线,传输距离都是100米。而且,在综合布线规范中,水平布线不能超过90米,链路总长度不能超过100米。换句话说,“100米”是有线以太网布线的一个极限。这个说法到底怎么来的,有啥依据,具体施工现场怎......
  • 在f1c100s芯片上移植spi网卡enc28j60的linux驱动
    前言我个人与全志的芯片颇有故事。在我还是一个不懂事的高中生时,我看到荔枝派的官方文档,顿时被这小小的板子给吸引住。点开文档的初见:荔枝派Nano(下面简称Nano)是一款精致迷你的Arm9核心板/开发板,可用于初学者学习linux或者商用于产品开发。Nano在与SD卡相当的尺寸上(25.4*3......
  • Leetcode 59. 螺旋矩阵 II && 剑指 Offer 29. 顺时针打印矩阵
    这两个题非常相似,但是前者较为简单,后者较难。由于前者访问的矩阵是方阵,因此可以通过迭代去做(因为方阵每次迭代,长和宽缩水的大小是一样的,但是矩阵不可以,因为矩阵最后一次迭代,长和宽的缩水不一定一样)classSolution{public:vector<vector<int>>generateMatrix(intn){......
  • 西农OJ P1005 装载问题
    装载问题问题描述有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi(i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。输入多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi(i=1…n)。n等于0标志输入结束。......
  • 打印X型图案
    intmain(){ intn=0; inti=0; intj=0; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) { printf("*"); } elseif((i+j)==n-1) { printf("*"); } else printf(&qu......
  • Reversing-x64Elf-100
     对应的脚本代码为: ......
  • 强化学习算法如何将GPU利用率提高到100%——在线强化学习如何将GPU利用率提升至100%
    一直有个疑问,那就是“强化学习算法如何将GPU利用率提高到100%”,在一些论坛中也有人会提出这样的问题,但是一直也没有人比较正面的回答过这个问题,为此正好自己又想到了这么一个问题,于是想在这里正面的谈论下这个问题。......
  • 【故障公告】多年的故障老朋友又来了:数据库服务器 CPU 100%
    数据库服务器CPU100%问题几乎每年都要来几次,从来都不事先打一声招呼,今年的第2次在我们正忙着会员救园的时候来了。今天13:35首先收到我们自己的异常告警通知:ExecutionTimeoutExpired.Thetimeoutperiodelapsedpriortocompletionoftheoperationortheserver......
  • fastjson对接口参数的某个字段不打印输出,如文件的base64字符串
    fastjson对接口参数的某个字段不打印输出,如文件的base64字符串packagecom.example.core.mydemo.json5;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.annotation.JSONField;/**需要提供getset方法,如果使用@Datalombok不生效(关键)**publicclassIte......
  • java编程题,打印n对括号的全部有效组合
    如题所述,当n=3时,可能的组合有:(()()),((())),()(()),(())(),()()()代码如下(有注释):importjava.util.ArrayList;importjava.util.List;publicclassTest06{/***通过递归生成n对括号的全部有效组合*@paramlist装括号组合的容器*@paramleftRem左括号剩余数量*@paramrightRe......