java 使用信号量实现任意n个线程的交替打印

    思路:给每个线程配一个信号量,后一个线程等前一个释放,第一个等最后一个释放,形成循环等待链,然后手动给第一个线程释放一个信号量使得程序执行起来

import java.util.concurrent.Semaphore;
public class mutil_print {
    public static volatile int i;
    public static int nums;
    public static class TA implements Runnable{
        Semaphore semaphore;
        Semaphore semaphore1;
        TA(Semaphore s,Semaphore s1){
            semaphore=s;
            semaphore1=s1;
        }
        @Override
        public void run() {
            while(i<nums){
                try {
                    //等待前一个线程释放当前线程的资源,使得当前线程执行
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(i<nums){
                    System.out.println(i+":"+Thread.currentThread().getName());
                }
                i++;
                //释放下一个线程的资源
                semaphore1.release();
            }
        }
    }
    public static void main(String[] args) {
        //思路:给每个线程配一个信号量,后一个线程等前一个释放,第一个等最后一个释放
        //形成循环等待链,然后手动给第一个线程释放一个信号量使得程序执行起来
        //多线程交替打印
        int Thread_nums=3;//交替打印的线程数量
        nums=10;//总共打印多少次
        //1.设置信号量
        Semaphore []semaphores=new Semaphore[Thread_nums];
        for(int i=0;i<semaphores.length;i++){
            semaphores[i]=new Semaphore(0);
        }
        //2.设置初始信号量,这里从哪个开始设置就从哪个线程开始执行
        semaphores[0].release();//设置初始信号量
        //3.设置线程并启动,开始打印
        for(int i=0;i<semaphores.length-1;i++){
            new Thread(new TA(semaphores[i],semaphores[i+1])).start();
        }
        new Thread(new TA(semaphores[semaphores.length-1],semaphores[0])).start();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值