java并发编程是什么,java并发包提供了哪些并发工具类

  java并发编程是什么,java并发包提供了哪些并发工具类

  如何解决写爬虫IP受阻的问题?立即使用。

  常用的辅助类

  1.CountDownLatch1.2 .示例:监视器锁门1.2。倒计时锁存器类介绍:1.2.CountDownLatch概念1.2.3倒计时锁存器的用法1.3.CountDownLatch案例:1.4。原理总结2。CyclicBarrier 2.1 . arrier 2.2的cyclicb介绍。案例:集齐七颗龙珠召唤神龙3.1。semophore 3.2简介。抢车位问题3.3。原理总结1.CountDownLatch

  1.2.示例:班长锁门问题

  说明:七个学生晚自习的话,班长有钥匙,负责锁门。直到所有人都走了,监视器才能关灯锁门。六个学生的顺序乱了,不知道什么时候走的。六个学生各自上自习去了,相互之间没有互动。假设6个学生是普通线程,班长是主线程。主线程怎么能等一堆线程运行完了,主线程才能运行完呢?

  公共类CountDownLatchDemo {

  公共静态void main(String[] args) {

  //TODO自动生成的方法存根

  for(int I=1;I=6;i ){

  新线程(()-{

  system . out . println(thread . current thread()。getname() \ t离开教室);

  },String.valueOf(i))。start();

  }

  system . out . println(thread . current thread()。getname() \ t班长关门走人);

  }}运行结果截图

  最后三个人被锁在老师的房间里,可能会导致意外,所以肯定不行。

  为了达到这种效果,主线程在所有其他线程完成之前不能运行。您需要使用JUC的CountDownLatch类。

  1.2.CountDownLatch类简介:

  1.2.1 CountDownLatch概念

  CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。

  CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务

  CountDownLatch描述:计数、递减计数、锁存开始

  1.2.3 CountDownLatch的用法

  某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

  底层构造函数源代码

  public CountDownLatch(int count){

  if (count 0)抛出新的IllegalArgumentException(“count 0”);

  this.sync=新同步(计数);

  }1.3.CountDownLatch案例:

  公共静态void main(String[] args)引发InterruptedException {

  //六个同学在自习,每个人都有1个计数器。如果你取一个数减去一,主线程开始。你必须等计时器从6变到0才能开始。

  CountDownLatch CountDownLatch=new CountDownLatch(6);

  for(int I=1;I=6;i ){

  新线程(()-{

  system . out . println(thread . current thread()。getname() \ t离开教室);

  countdownlatch . count down();//少算一个。

  },String.valueOf(i))。start();

  }

  countdownlatch . await();//显示器的前面需要挡住

  system . out . println(thread . current thread()。getname() \ t班长关门走人);

  }运行结果截图

  我不知道大家什么时候离开这里,但我可以保证每次班长都会是最后一个离开的。

  1.4.原理总结

  CountDownLatch有两个主要方法。当一个或多个线程调用await方法时,这些线程将被阻塞。

  其他调用countDown方法的线程会将计数器减1(调用countDown方法的线程不会阻塞)

  当计数器的值变为0时,被await方法阻塞的线程将被唤醒并继续执行。

  2.CyclicBarrier

  2.1.CyclicBarrier简介

  循环周期,屏障屏障。

  从字面意思可以知道,这个类的中文意思是“圆形栅栏”。它可能意味着一个可回收的屏障。它的作用就是会让所有线程都等待完成后才会继续下一步行动。

  上面这个班长关门的例子是倒计时。在这里,情况正好相反。加,数完就开始。比如比如人到齐了,再开会。,就像生活中一样,我们邀请同事一起开会。有些同事可能会早到,有些可能会晚到。但是,这次会议规定,必须等到大家都到齐了,才能正式见面。我们这里的同事都是线程,会议是循环障碍。

  施工方法

  公共循环屏障(int parties)分析公共循环屏障(int parties,runnable barrier action): parties是参与线程的数量。

  第二个构造方法有一个Runnable参数,这意味着最后到达的线程要完成的任务。

  我们通常使用第二个构造函数。

  2.2.案例:集齐7颗龙珠召唤神龙

  公共静态void main(String[] args) {

  //TODO自动生成的方法存根

  循环屏障循环屏障=新循环屏障(7,()-{system.out.println(召唤神龙);});

  for(int I=1;I=7;i ){

  final int tempInt=I;

  新线程(()-{

  system . out . println(thread . current thread()。getname() \ t tempInt dragon ball 已收集);

  尝试{

  //一个线程已经收集了龙珠,只能等到龙珠收集完毕再召唤龙。

  cyclic barrier . await();

  } catch(异常e) {

  //TODO自动生成的catch块

  e . printstacktrace();

  }

  },String.valueOf(i))。start();

  }

  }截图

  3.Semophore

  3.1.Semophore简介

  上面讨论的问题都是多对一的问题。现在我们可以讨论多对多的问题。

  假设七兄弟开车上班,现在只有四个车位。七辆车并排开进了四个车位,每辆车停了多久都不知道。资源被占用。假设有一辆车只停了2s,那么它已经走了,外面的车可以再进来。一个一个去,最后都能进去。Semophore是一种控制多线程的并发策略。

  简单理解来说,Semaphore:信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制。

  信号量类有两个重要的方法。

  1、semaphore . acquire();

  请求信号量。此时,信号量的数量为-1。当它减小到0时,将不会执行下一次采集。只有在执行release()时,当信号量不为0时,才能继续获取。

  2、semaphore.release()。

  释放信号量。此时,信号量的数量是1,

  3.2.抢车位问题

  公共静态void main(String[] args) {

  //模拟6辆车抢3个空车位。

  信号量信号量=新信号量(3);//模拟资源类,有3个空车位

  for(int I=1;I=6;i ){

  新线程(()-{

  尝试{

  //谁先抢到谁就占一个车位,信号量的资源数减1。

  semaphore . acquire();

  system . out . println(thread . current thread()。getname() \ t调整了停车位);

  时间单位。seconds . sleep;

  system . out . println(thread . current thread()。getname () \ t离开停车位);

  } catch(异常e) {

  //TODO自动生成的catch块

  e . printstacktrace();

  }最后{

  //释放停车位

  semaphore.release()。

  }

  },String.valueOf(i))。start();

  }

  }运行结果截图:

  3.3.原理总结

  我们在信号量上定义了两个操作:

  acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等待下去,直到有线程释放信号量,或超时。

  release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。

  信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制

  如果资源数量从3更改为1,则相当于同步。以上是Java并发编程,介绍常用辅助类的细节。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: