![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 88
aYuIsAyU
这个作者很懒,什么都没留下…
展开
-
JUC之ForkJoin框架
ForkJoinForkJoin是由JDK1.7后提供多线并发处理框架, ForkJoin的框架的基本思想是分而治之。使用ForkJoin将相同的计算任务通过多线程的进行执行, 从而能提高数据的计算速度。在google的中的大数据处理框架mapreduce就通过类似ForkJoin的思想, 通过多线程提高大数据的处理。使用ForkJoin框架, 需要创建一个ForkJoin的任务。因为ForkJoin框架为我们提供了RecursiveAction和RecursiveTask。我们只需要继承ForkJoi原创 2022-04-16 00:44:43 · 109 阅读 · 0 评论 -
JUC之线程池
什么是线程池线程池(thread pool):一种线程使用模式。线程过多会带来调度开销, 进而影响缓存局部性和整体性能。而线程池维护着多个线程, 等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用, 还能防止过分调度。特点:降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的销耗。提高响应速度: 当任务到达时, 任务可以不需要等待线程创建就能立即执行。提高线程的可管理性: 线程是稀缺资源, 如果无限制的创建 ,不仅会原创 2022-04-15 20:42:11 · 266 阅读 · 0 评论 -
JUC之阻塞队列
什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时, 获取元素的线程会等待队列变为非空。当队列满时, 存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景, 生产者是往队列里添加元素的线程, 消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器, 而消费者也只从容器里拿元素。当队列是空的, 从队列中获取元素的操作将会被阻塞当队列是满的, 从队列中添加元素的操作将会被阻塞试图从空的队列中获取元素的线程将会被阻塞,原创 2022-04-15 20:40:33 · 85 阅读 · 0 评论 -
JUC之辅助类
CountDownLatch(闭锁)什么是CountDownLatchCountDownLatch是一个同步工具类, 用来协调多个线程之间的同步, 或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后, 再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后, 计数器的值就会减一, 当计数器的值为0时, 表示所有的线程都已经完成一些任务, 然后在CountDownLatch上等待的线程就可以恢复原创 2022-04-15 20:38:53 · 186 阅读 · 0 评论 -
JUC之Callable接口
Callable创建线程有四种方式:继承Thread类实现Runnable接口Callable接口线程池前两种前面说过了, Runnable接口是比较常用的, 因为在Java中继承是很重要的, 不能随便使用, 但是Runnable接口有一个缺点, run()方法没有返回值, 也就是当线程结束时, 不能返回结果, 为了能返回结果, 在JDK1.5以后出现了Callable接口:@FunctionalInterfacepublic interface Callable<V> {原创 2022-04-15 20:37:07 · 2732 阅读 · 0 评论 -
JUC之各种锁
公平锁和非公平锁回头看一下之前的一个多线程买票案例public class LockSaleTicket { public static void main(String[] args) { LockTicket lockTicket = new LockTicket(); new Thread(()->{ for (int i = 0; i < 20; i++) { lockTicket.sal原创 2022-04-15 20:34:42 · 579 阅读 · 0 评论 -
JUC之锁的八种情况
准备工作创建一个资源类Phone(手机), 里面两个方法sendEmail(发邮件), sendSMS(发短信), 都是线程同步方法class Phone { public synchronized void sendSMS() { System.out.println("------sendSMS"); } public synchronized void sendEmail() { System.out.println("------sendE原创 2022-04-15 20:31:23 · 108 阅读 · 0 评论 -
JUC之集合线程安全
List集合演示先来看下面一段代码:List <String> list = new ArrayList<>();//多线程并发访问for (int i = 0; i < 10; i++) { new Thread(() -> { //添加数据 list.add(UUID.randomUUID().toString().substring(0, 8)); //读取数据 System.out.p原创 2022-04-15 20:29:44 · 313 阅读 · 0 评论 -
JUC之线程间通信
前言我们知道了什么是线程, 知道了什么是锁, 但是怎样编写多线程程序呢? 通过下面的文章将告诉大家编写一个简单的多线程程序需要那几步。线程间通信谈到线程间通信就不得不说一个经典的生产者-消费者模型, 我们假定这样一个场景:一个小小的饮品店, 桌子太小了每次只能放一杯饮品桌子上没有饮品的时候顾客就会等待桌子上有饮品的时候店长就不做了(很佛系)我们尝试用代码实现以下这个场景:把饮品店, 饮品, 做饮品, 取饮品给抽象出来class IceCream{ //饮品 priv原创 2022-04-15 20:27:42 · 96 阅读 · 0 评论 -
JUC之初识锁
先来看一段代码使用三个线程来模拟三个售票员售票, 票数是固定的, 并且在三个售票员之间时共享的。public class SaleTicket { public static void main(String[] args) { //创建Ticket对象 Ticket ticket = new Ticket(); //创建三个线程 new Thread(() -> { for (int i = 0; i原创 2022-04-15 20:24:44 · 64 阅读 · 0 评论 -
JUC之初识线程
线程与进程的区别在讨论多线程之前, 我们先来了解一下什么是线程, 什么是进程, 以及两个的区别是什么:进程(Process)计算机中的程序关于某数据集合上的一次运行活动进程是线程的容器程序是指令、数据及其组织形式的描述,进程是程序的实体系统进行资源分配和调度的基本单位,是操作系统结构的基础线程(thread)操作系统能够进行运算调度的最小单位被包含在进程之中,是进程中的实际运作单位一条线程指的是进程中一个单一顺序的控制流如果没有操作系统知识的话有点难理解上面的话, 我用一个原创 2022-04-15 20:22:05 · 224 阅读 · 0 评论