JUC

首先来说说synchronized的有什么缺点。

它非常的死板。要么获取锁,要么等待锁,而且我们无法知晓此时这个锁有没有被人拿到,也不知道某个线程是否是上锁状态。

只有悲观锁、排他锁,没有乐观锁、共享锁。有些资源允许很多线程去读,但是只允许一个线程写,这样的锁叫做共享锁。悲观锁就是做某个操作必须要拿到一个锁。乐观锁就是先去把一个任务做完,但由于多个线程竞争这个操作没有正确完成,那就重新做一遍,直到正确为止。

性能相对较差

java.util.concurrent简称JUC,是Java的并发工具包,解决了上述的一些问题。

Lock / Condition

Lock提供了一个更加复杂的锁机制。它允许更加灵活的结构,支持不同的方法,支持相关的Condition操作。

同一个锁可以有多个条件。

读写分离。Lock的实现中有读锁WriteLock和写锁ReadLock。

tryLock方法。如果该锁可用立刻返回true,不可用则立刻返回false。

可以方便的实现更加灵活的优先级/公平性。公平性指的是,假如有多个线程竞争一个锁的话,我以什么顺序给它们。非公平锁,主要靠操作系统的调度。Lock的实现中有可重入锁ReentrantLock(默认是非公平锁,可以传一个参数让它变成公平锁)。

Conditon把Object的monitor方法(wait,notify,notifyAll)拆出来成了独立的对象,使得支持多个等待集合。

CountDownLatch

倒数闭锁。

用于协调一组线程的工作。

它的API简单暴力countDown(),await()。以下是一个使用例子:

public class Main {

public static void main(String[] args) throws InterruptedException {

final CountDownLatch countDownLatch = new CountDownLatch(10);

for (int i = 0; i < 10; i++) {

int finalI = i;

new Thread(() -> {

int second = new Random().nextInt(10);

try {

Thread.sleep(second * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("线程" + finalI + "干完活了");

countDownLatch.countDown();

}).start();

}

countDownLatch.await();

System.out.println("老板发话了,所有人干完活了!");

}

}

CyclicBarrier

循环的屏障

等所有线程执行完了,才继续:

public class Main {

public static void main(String[] args) throws InterruptedException {

final CyclicBarrier cyclicBarrier = new CyclicBarrier(5);

for (int i = 0; i < 5; i++) {

int finalI = i;

new Thread(() -> {

int second = new Random().nextInt(10);

try {

Thread.sleep(second * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("线程" + finalI + "干完活了");

try {

cyclicBarrier.await();

} catch (InterruptedException | BrokenBarrierException e) {

e.printStackTrace();

}

System.out.println("所有线程都执行完了,大家一起说!");

}).start();

}

}

}

Semaphore

信号量

信号量的获取和释放

BlockingQueue & BlockingDeque

传统的集合框架的操作要么正常返回,要么丢出异常,BlockingQueue/BlockingDeque提供⼀种「等待」的可能。

API: 阻塞操作:put/take。

先声明容量大小,如果put超过容量,则会等待另一个线程take。

BlockingQueue先进先出。BlockingDeque头尾都能进出,更加灵活。

Future & ExecutorService

Future代表⼀个「未来才会发⽣的事情」。

Future本身是⽴即返回的。

get()会阻塞并返回执⾏结果,并抛出可能的异常。异常的抛出一般只会在当前线程,而get可以把其他线程的异常转移到当前线程抛出。

线程池的参数。建议看ExecutorService的一个实现:ThreadPoolExecutor文档。

* Creates a new {@code ThreadPoolExecutor} with the given initial

* parameters and default rejected execution handler.

*

-----* 核心线程的数量,哪怕它们闲下来,也不会被丢弃。

* @param corePoolSize the number of threads to keep in the pool, even

* if they are idle, unless {@code allowCoreThreadTimeOut} is set

-----* 最多可以开这么多的线程工作。

* @param maximumPoolSize the maximum number of threads to allow in the

* poo

-----* 下面两个是联合使用的,非核心线程空闲多久会被杀死。

* @param keepAliveTime when the number of threads is greater than

* the core, this is the maximum time that excess idle threads

* will wait for new tasks before terminating.

* @param unit the time unit for the {@code keepAliveTime} argument

-----* 保存那些还没被执行的任务。

* @param workQueue the queue to use for holding tasks before they are

* executed. This queue will hold only the {@code Runnable}

* tasks submitted by the {@code execute} method.

-----* 每当你需要一个新的线程的时候,用它来创建。

* @param threadFactory the factory to use when the executor

* creates a new thread

-----* 假如任务来的太快,把任务队列撑满了,要采取何种策略?

-----* AbortPolicy丢弃策略、CallerRunsPolicy让调用者执行

-----* DiscardOldestPolicy丢弃最老的一个任务、DiscardOldestPolicy丢弃最新的一个任务。

* @param handler the handler to use when execution is blocked

* because the thread bounds and queue capacities are reached

还可以举一个通俗易懂的例子,假如你是一个老板,有如下的参数解释:

corePoolSize 核⼼员⼯数量

maximumPoolSize 最⼤招募的员⼯数量

keepAliveTime/unit 员⼯闲下来多久之后炒掉他们

workQueue 订单队列

threadFactory 造⼈的⼯⼚

handler 订单实在太多的处理策略

Java 默认实现的线程池,使用Executors.xxx创建一个线程池,且这些方法大多都返回一个ThreadPoolExecutor,如下所示:

public static ExecutorService newxxxThreadPool(xxx) {

return new ThreadPoolExecutor(六个参数);

}

java 线程包_Java 多线程——工具包相关推荐

  1. java线程基础_Java多线程基础

    前言 在我们工作和学习的过程中,Java线程我们或多或少的都会用到,但是在使用的过程上并不是很顺利,会遇到各种各样的坑,这里我通过讲解Thread类中的核心方法,以求重点掌握以下关键技术点: 线程的启 ...

  2. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  3. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...

    线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...

  4. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  5. java线程 锁_Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  6. java线程设计模式_JAVA多线程设计模式

    漫谈UML UML 类图 类和层次结构的关系 接口与实现 聚合 访问控制 类间的关联性 顺序图 处理流程和对象间的协调 时序图 Introduction 1 Java语言的线程 Java语言的线程 何 ...

  7. java线程栅栏_Java 多线程基础 - CyclicBarrier

    我的博客 转载请注明原创出处. 序 java.util.concurrent包里有几个能帮助人们管理相互合作的线程集的类,为多线程常见的应用场景预置了抽象好的类库.在遇到这些应用场景时应该直接重用合适 ...

  8. java 线程通讯_java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  9. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

最新文章

  1. ReentrantReadWriteLock读写锁的使用
  2. 400名微软员工主动曝光薪资:28万元到228万元不等!
  3. ssm中shiro的使用
  4. 使用Cordova打包Vue项目为IOS并使用XCode提交到AppStore
  5. python format 冒号_python之格式化输出
  6. 网易如何做新闻推荐:深度学习排序系统及模型
  7. windows Anaconda lightgbm 安装
  8. Windows核心编程_inlineHook
  9. 共226款Html5小游戏源码分享
  10. 计算机电子表操作格试题,全国计算机等级考试四Excel电子表格操作试题
  11. 安全测试——SQL注入
  12. 十代服务器芯片组,Intel自曝400、495系列芯片组:搭档十代酷睿
  13. 红米note3android5.0,小米红米note3MOSBeta5.0安卓8.1.0来去电归属农历等本地化增强适配...
  14. Bootstrap4模态框垂直居中
  15. 2022年中式烹调师(高级)操作证考试题库及模拟考试
  16. 2022-2028全球与中国犁螺栓市场现状及未来发展趋势
  17. 蓝牙HC05模块,AT其他指令爆出ERROR[0] 解决方法
  18. 如何Disable Alfresco的Download以及打印功能
  19. 创建windows 窗口
  20. sql语句,如何找出重复的数据

热门文章

  1. 第七章 正则化-机器学习老师板书-斯坦福吴恩达教授
  2. 【体验】朗读机器人是如何炼成的!带你体验TTS语音合成模块,B719语音合成模块效果测试...
  3. 【s操作】手机移动数据网络问题初级解决方案,论手机运营商网络状况
  4. 基于MATLAB的MIMO系统分层空时码的仿真
  5. 8.Verilog的for循环语句使用
  6. 【网上的都不靠谱?还是得改源码】用Javasisst的字节码插桩技术,彻底解决Gson转Map时,Int变成double问题...
  7. 《ASP.NET MVC企业实战》(二) MVC开发前奏
  8. jq实现div移入与移出以及获得与失去焦点
  9. HTML5 元素选择流程图
  10. WPF数据绑定(1-简单数据绑定)