Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

    • Java基础

    • Java进阶

    • Java容器

    • Java并发编程

      • 并发编程基本概念
      • 多线程
      • 创建多线程的方法
      • 比较与交换CAS
      • Java对象头与Monitor监视器
      • Java主流锁
      • synchronized关键字
      • volatile关键字
      • 线程池
      • 原子类Atomic
      • LockSupport工具
      • 抽象队列同步器AQS
      • ThreadLocal深度理解
      • 多线程循环打印代码
        • 使用信号量Semaphore
        • 使用信号量Semaphore并使用一个类作为缓存
      • 线程等待和唤醒的三种方式
      • ReentrantLock非公平锁的源码分析
    • Java虚拟机

    • 常见面试题

  • 计算机基础

  • 框架|中间件

  • 架构

  • 后端
  • Java
  • Java并发编程
Marvel
2022-07-13
目录

多线程循环打印代码

# 多线程循环打印数字

# 使用信号量Semaphore

public class CirclePrint {
    public static void main(String[] args) {
        int threadCount = 10;
        int numCount = 100;
        List<Semaphore> list = new ArrayList<>();
        for (int i = 0; i < threadCount; i++) {
            list.add(new Semaphore(0));
        }
        list.get(0).release();

        for (int i = 0; i < threadCount; i++) {
            int curIndex = i; // lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

            Thread t = new Thread(() -> {
                for (int j = curIndex; j < numCount; j+=threadCount) {
                    try {
                        list.get(curIndex).acquire();
                        System.out.println(Thread.currentThread().getName() + ": " + j);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        list.get((curIndex + 1) % threadCount).release();
                    }
                }

            });
            t.start();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 使用信号量Semaphore并使用一个类作为缓存

public class CirclePrint3 {
    public static void main(String[] args) {
        DataCache dataCache = new DataCache();

        final int threadCount = 10;
        final int numCount = 103;

        List<Semaphore> list = new ArrayList<>(threadCount);
        for (int i = 0; i < threadCount; i++) {
            list.add(new Semaphore(0));
        }
        list.get(0).release();

        for (int i = 0; i < threadCount; i++) {
            int index = i; // lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
            new Thread(() -> {
                while (true) {
                    try {
                        list.get(index).acquire();
                        if (dataCache.get() < numCount) {
                            System.out.print(Thread.currentThread().getName() + ": ");
                            dataCache.add();
                            System.out.println(dataCache.get());
                        } else {
                            break;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        list.get((index + 1) % threadCount).release();
                    }
                }
            }, String.valueOf(i)).start();
        }
    }
}

class DataCache {
    private volatile int i = 0;

    public void add() {
        i++;
    }

    public int get() {
        return i;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
编辑 (opens new window)
#Java#JUC
上次更新: 2023/08/20, 21:21:52
ThreadLocal深度理解
线程等待和唤醒的三种方式

← ThreadLocal深度理解 线程等待和唤醒的三种方式→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式