多线程同步的巧用

博客转移到个人站点:
http://www.wangchengmeng.club/2018/02/04/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E7%9A%84%E5%B7%A7%E7%94%A8/

欢迎来吐槽

多线程

Semaphore的运用
introduce:Semaphore是java1.5并发库中关于多线程同步的一个类,可以在实例化对象的时候规定每次允许
线程执行的个数,然后每次执行都只能按照规定的个数线程去执行,当一个线程执行完毕后,外面的线程才能进去一个执行。

code:

    @Override
    public void run() {
        try {
            //获取到执行的锁
            mSemaphore.acquire();
            //中间只能有规定(实例化semaphore的时候传入参数)个数的线程同时执行,执行完毕一个,就进去一个
            Log.d("aaa", "第" + this.mCount + "线程进来了");
            SystemClock.sleep(3000);
            Log.d("aaa","第" + this.mCount + "线程出去了");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //释放掉锁
        mSemaphore.release();
   }
CyclicBarrier的运用
introduce:CyclicBarrier是在多线程的情况下,使线程出于等待状态,在实例化对象的时候传入一个int参数,是规定在等到了多少个线程都到达了的时候就一起进去执行,否则就等待

code:

    @Override
    public void run() {
        try {
            Log.d("aaa", "第"+mCount+"个线程已经到了");
            //mCyclicBarrier = new CyclicBarrier(3);  等待满了三个线程就执行下去 否则就等待
            mCyclicBarrier.await();
            SystemClock.sleep(3000);
            Log.d("aaa", "第" + mCount + "个线程已经执行完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
阻塞队列 BlockQueue
ArrayBlockQueue queue = new ArrayBlockQueue(1);
也就是初始化 一个容量为1的队列 

queue.put(2); 放入了一个元素 ,再继续放入元素 就会阻塞 一直到可以放入元素再执行
queue.take(); 取出一个元素 当没有元素 就阻塞 一直到有元素再执行
线程中的一个小知识(重要)
eg:

    new Thread(new Runnable(){
    public void run(){
        System.out.println("Runnable");
    }
    }){
    public void run(){
        system.out.println("Thread");
    }
    }.start();
    仔细分析 一下这段代码,然后分析出打印的结果

    首先是创建了一个Thread的匿名子类对象并实现了其父类的方法,其次传入了一个Runnable的匿名子类对象并实现了接口的方法。

    注意:当我们在开启线程并传入Runnbale子类对象的时候,之所以去执行Runnbale中的run方法,是因为Thread这个类中的run方法指定了去执行Runnbale中的run方法,在这里已经覆盖了Thread中的run方法,并且没有去指定执行Runnbale中的run方法,所以在这里打印出  “Thread”
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值