多线程交替打印数字1,2,3....n ,第i个线程打印i, lock 信号量实现

public class MainThread {
    public static ReentrantLock lock=new ReentrantLock();

    public  static  void main(String[] args) throws Exception {
        ArrayList<Thread> list=new ArrayList<>();
        Scanner in =new Scanner(System.in);
        int n=in.nextInt();
        ArrayList<Condition> conlist=new ArrayList<>();
        boolean []flag=new boolean[n];
        for(int i=0;i<n;i++)
        {
            conlist.add(lock.newCondition());
        }
        for(int i=0;i<n;i++) {
            final int j=i;

           list.add( new Thread(new Runnable() {
                @Override
                public void run() {
                        try {
                            lock.lock();

                            int c=j;


                           if(c>0){
                               //while条件限制
                            while(!flag[c]){
                                   conlist.get(j).await();
                               }

                            }
                          System.out.println(c+1);

                           if(c+1<n)
                           {

                             flag[c+1]=true;//一种标识,类似生产消费模型的数量标识
                              conlist.get(c+1).signal();
                           }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }finally {
                            lock.unlock();
                        }

                }
            }));
        }

     for(int i=0;i<n;i++)
      {
         list.get(i).start();


      }

    }


}

 

 

 

输出:


9
1
2
3
4
5
6
7
8
9

 

当然也可以使用countdownLatch实现,同步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值