juc
一半面具
懒得写~~~~~~~~~
展开
-
JUC的异步回调——CompletableFuture
在juc里面有一个神奇的类—— CompletableFuture,他就像AJAX一样可以实现异步回调,可以设置有无返回结果。具体操作如下: //无返回结果 CompletableFuture<Void> completableFuture=CompletableFuture.runAsync(()->{ try { TimeUnit.SECONDS.sleep(2); } catch原创 2021-06-19 15:29:38 · 160 阅读 · 0 评论 -
7大参数自定义线程池
在实际开发中,经常会用到的就是自定义线程池,通过new ThreadPoolExecutor(…),并添加需要的参数和设置需要的值,以下是7大参数的使用方法:1.corePoolSize:设置核心线程数量。2.maximumPoolSize:设置最大的线程数(当线程数达到此值时就会触发)。3.keepAliveTime:超时等待时长(当没有空闲的线程时且超过这个值的时间,就会自动关闭线程池允许的最大线程数,恢复到默认的核心线程数量)。4.TimeUnit unit:设置keepAliveTime的时原创 2021-06-16 18:08:13 · 1111 阅读 · 0 评论 -
三种线程池newSingleThreadExecutor,newFixedThreadPool,newCachedThreadPool
在实际工作中传统的创建线程方法是很浪费资源的,因为要创建线程,然后还要销毁线程,如果线程量太多的话,对于程序的响应速度会有比较大的影响,而利用线程池去创建线程的话,是能够有效的优化我们程序的运行速度。线程池比较常用的有三种,具体用法如下:第一种:...原创 2021-06-15 20:02:53 · 309 阅读 · 0 评论 -
Blokingqueue的四组api
Blokingqueue有四组api都可以对元素进行添加和移除,但还是有不一样的地方。具体用法如下代码: //1.会抛出异常 void test1(){ ArrayBlockingQueue blockingQueue=new ArrayBlockingQueue(3); System.out.println(blockingQueue.add("a")); System.out.println(blockingQueue.add("b"));原创 2021-06-15 16:56:11 · 73 阅读 · 0 评论 -
读写锁(ReadWriteLock)的使用
我们知道在执行写操作时是不允许有其他线程插入,而读操作则可以允许一起读。写锁又称为独占锁,读锁又称为共享锁。用法:ReadWriteLock readWriteLock=new ReentrantReadWriteLock();//声明读写锁 readWriteLock.writeLock().lock();//声明写锁 readWriteLock.writeLock().unlock();//声明写锁解锁 readWriteLock.readLock().lock();//声明读锁原创 2021-06-15 15:43:01 · 426 阅读 · 0 评论 -
高并发常用辅助类
1.CountDownLatch减法计时器用法:CountDownLatch countDownLatch=new CountDownLatch(10);//设置十个线程进行,并开始倒计时,等待归零并执行下一步操作。countDownLatch.await();//等待归零2.CyclicBarrier加法计时器用法: CyclicBarrier barrier=new CyclicBarrier(7,()->{ System.out.println("吃完了!"原创 2021-06-15 14:08:37 · 85 阅读 · 0 评论 -
Callable的使用
在jdk官方文档是这样对Callable介绍:返回结果的一个任务,并可能抛出异常。用户定义一个不带参数调用 call的Callable接口类似于Runnable,,是专为其实例的类可能被另一个线程执行。然而,Runnable,不返回结果并不能抛出异常。Executors类包含的实用方法与其他常见的形式转换为Callable类。使用方法其实也挺简单,如下代码:public class Day5 { public static void main(String[] args) throws Ex原创 2021-05-29 15:18:50 · 601 阅读 · 0 评论 -
集合类不安全的解决方案
像一些如list、set、map集合类 在多线程的场景下是不安全的,对此有三种常见的解决方案:1、List<String> list= new Vector<>();Set<String> set= new Vector<>();Set<String> set= new Vector<>();2、 List<String> list= Collections.synchronizedList(ne原创 2021-05-29 14:50:07 · 94 阅读 · 0 评论 -
八锁现象彻底理解解锁
第一个问题:假设有一个对象调用两个线程,请问这两个线程的执行顺序?根据这个问题我们先上一段代码:import java.util.concurrent.TimeUnit;public class Day3 { public static void main(String[] args) { Phone phone=new Phone(); new Thread(()->{ try { phone.se原创 2021-05-16 15:22:35 · 139 阅读 · 0 评论 -
生产者消费者问题的两种解决方法
在高并发的环境下,出现了一个生产者消费者问题,如何保证生产者和消费者能够保持顺序执行,不会出现资源争抢问题?有两种解决方案:我们先假设有如下场景:有一个数字0,有两个方法,第一个方法是检测数字是否为0,如果为0则启动等待线程,并为数字加一,然后通知所有其他线程。第二个方法则是当数字不为0时,执行数字减一操作。第一种:利用 传统方法先给业务代码的方法加一个同步锁,然后有序的等待和通知,即加一个wait和notifyAll方法。代码如下:public class Day2 { public原创 2021-05-15 20:03:27 · 562 阅读 · 0 评论