欢迎来吐槽
多线程
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”