Java并发——两个线程交替打印两个数组中的元素 | 多个线程按顺序输出数字

本文介绍了如何在Java中实现两个线程交替打印两个数组的元素,以及启动三个线程按顺序输出数字1, 2, 3。通过LockSupport、自旋锁、wait/notify、ReentrantLock(单condition和多condition)等方式展示了并发控制的多种方法,并提示了使用Semaphore、BlockingQueue和PipedStream等其他可能的解决方案。" 109288508,3141807,LaTeX数学公式完全指南,"['latex', '数学公式']
摘要由CSDN通过智能技术生成
有两个字符数组
  • number = {‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’}
  • letter = {‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’,‘I’}
要求启动2个线程,交替打印其中元素,输出结果为
  • 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I

本文给出类LockSupport,自旋锁,wait/notify,ReentrantLock实现该功能的方式。还有一些方法比如Semaphore(使用信号量实现限流,通过acquire和release方式每次只允许一个线程执行)、BlockingQueue(需要用两个BlockingQueue,通过两个BlockingQueue之间的信息交互和put、take方法达成功能)、管道流(PipedStream),这些方法也可以完成功能,请读者自行考虑实现。

LockSupport的方法

最简单的的一种方式,使用park和unpark的方式完成两个线程之间的通信

public static void main(String[] args) {
   
        char[] number = {
   '1','2','3','4','5','6','7','8','9'};
        char[] letter = {
   'A','B','C','D','E','F','G','H','I'};
         t1 = new Thread(() ->{
   
            for(char num : number){
   
                System.out.print(num + " ");
                LockSupport.unpark(t2);  //唤醒t2线程
                LockSupport.park();  //将本线程阻塞
            }
        });

         t2 = new Thread(() ->{
   
            for(char let : letter){
   
                LockSupport.park();  //防止t2线程先执行从而先输出A
                System.out.print(let + " ");
                LockSupport.unpark(t1);  //唤醒t1线程
            }
        });

        t1.start();
        t2.start();
}
模拟自旋锁的方式

使用一个原子类型的值当作自旋的标示,如果线程要执行时发现标示不对,则一直while自旋等待

static final AtomicInteger threadNo = new AtomicInteger(1);

public static void main(String[] args) {
   
        char[] number = {
   '1','2','3','4','5','6','7','8','9'};
        char[] letter = {
   'A','B','C','D','E'
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值