多线程相关 ,了解一下?
Posted 程序员食堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关 ,了解一下?相关的知识,希望对你有一定的参考价值。
各位看官好啊,欢迎来到今天的程序员食堂
今天提供大餐是,多线程相关
您是打包还是带走?
1闭锁:
闭锁(CountDownLatch)是一种同步工具类,可以延迟线程的进度直到闭锁达到一种终止状态。
举例来说,相当于一扇大门,活动开始前半小时观众不能入场,来早的人只能等待,一旦门打开所有的线程将通过,闭锁的状态也会失效,而且是永久的保持打开状态,即闭锁的状态是一次性的。
(java.util包下concurrent接口下的CountDownLatch类)
public class CountDownLatchText{
publicstatic void main(String[] args) throws Exception{
CountDownLatchlatch=new CountDownLatch(2);
Threadt1=new Thread(new Runnable() {
publicvoid run() {
//加载1
System.out.println("Loadingsource one");
//加载完后闭锁-1
latch.countDown();
}
});t1.start();
Threadt2=new Thread(new Runnable() {
publicvoid run() {
//加载2
System.out.println("Loadingsource two");
//加载完后闭锁-1
latch.countDown();
}
}); t2.start();
Threadt3=new Thread(new Runnable() {
publicvoid run() {
//必须等待所有资源加载完后才能执行
try{
latch.await();
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//当闭锁数量为10时,await返回,执行接下来的任务
System.out.println("Loadingsource three");
}
});t3.start();
}
}
CountDowmLatch是一种灵活的闭锁实现,包含一个计数器,该计数器初始化为一个正数,表示需要等待事件的数量。
countDown()方法递减计数器,表示有一个事件发生,而await方法等待计数器到达0,表示所有需要等待的事情都已经完成。
相关的应用:
①确保某个服务在其依赖的所有服务都已启动之后才启动。
②等待直到某个操作的所有参与者都就绪再继续执行。
③死锁检测,可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁
2同步屏障
与闭锁类似的:栅栏(CyclicBarrier) 即同步屏障
阻塞一组线程直到某个事件发生。区别在于栅栏的所有线程必须同时到达栅栏位置,才能继续执行,即栅栏用于等待其它线程。且栅栏位置可以留着下次再使用。栅栏也有栅栏“动作”,会在所有线程到达后执行动作。
就相当于班会集合一样,得等到所有人都到场后才能继续接下来的事情。
应用:多线程计算数据,最后合并计算结果。
java.util包下concurrent接口下的CyclicBarrier类。
public class CyclicBarrierText {
public static void main(String[] args) {
ExecutorService newCachedThreadPool=Executors.newCachedThreadPool();
final CyclicBarrier cyclicBarrier=new CyclicBarrier(3);
for (int i = 0; i < 3; i++) {
Runnable runnable=new Runnable() {
@Override
public void run() {
try {
Thread.sleep(newRandom().nextInt(10000));
System.out.println("线程"+Thread.currentThread().getName()
+"即将到达1,当前已有"+(cyclicBarrier.getNumberWaiting()+1)
+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?" 都到齐了,继续走":"正在等待"));
cyclicBarrier.await();
Thread.sleep(newRandom().nextInt(10000));
System.out.println("线程"+Thread.currentThread().getName()
+"即将到达2, 当前已有"+(cyclicBarrier.getNumberWaiting()+1)
+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?" 都到齐了,继续走":"正在等待"));
cyclicBarrier.await();
Thread.sleep(newRandom().nextInt(10000));
System.out.println("线程"+Thread.currentThread().getName()
+"即将到达3, 当前已有"+(cyclicBarrier.getNumberWaiting()+1)
+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?" 都到齐了,继续走":"正在等待"));
cyclicBarrier.await();
} catch(InterruptedException e) {
e.printStackTrace();
} catch(BrokenBarrierException e) {
e.printStackTrace();
}
}
};
newCachedThreadPool.execute(runnable);
}
newCachedThreadPool.shutdown(); //执行完成后关闭线程池
}
}
往期学员,3人团报立减200元!
根据校区所在地不同,住宿费会有所不同,价格调动均在正常范围内~
【仅限十人、仅限十人、仅限十人、仅限十人、仅限十人】
Java/前端/产品,新卓越做你梦想的最佳推手!
记得吃完饭哦~
用了这么久了,
以上是关于多线程相关 ,了解一下?的主要内容,如果未能解决你的问题,请参考以下文章