多线程相关 ,了解一下?

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/前端/产品,新卓越做你梦想的最佳推手!


记得吃完饭哦~

程序员食堂

用了这么久了,



以上是关于多线程相关 ,了解一下?的主要内容,如果未能解决你的问题,请参考以下文章

多线程

渲染优化(多线程渲染)

软件构造(复习)——一些关于多线程的知识

企业面试系列你需要了解的Netty相关

iOS详解多线程(实现篇——pThread)

多线程与多进程