您的位置:首页 > 编程语言 > Java开发

多线程同步的巧用

2016-03-25 15:25 375 查看
博客转移到个人站点:

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”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息