![](https://img-blog.csdnimg.cn/20190914235023486.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
【Java多线程】
每一个技术人员的核心技能和必备技能
痴书先生
静以修身,俭以养德
展开
-
Java面试专题-多线程(3)-原子操作
Q:什么是CAS算法?CAS(compare and swap)的缩写。 Java利用CPU的CAS指令,同时借助JNI来完成对Java的非阻塞算法,实现原子操作(其实就是自旋操作,不断循环,直到成功)。其它原子操作都是利用类似的特性来完成的。CAS有三个关键操作值:内存值V、预期值A、要修改的值B。当且仅当预期值A和内存值V一致时,才会将内存值V内容修改为B,否则将什么都不做。CAS的缺点也很明显:在并发量比较高的情况下,如果许多线程反复尝...转载 2020-12-19 17:30:03 · 154 阅读 · 1 评论 -
Java面试专题-多线程篇(2)- 锁和线程池
Q:乐观锁 和 悲观锁乐观锁:乐观锁(Optimistic Locking)其实是一种思想。相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。悲观锁:Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。独占锁就是一...转载 2020-12-19 17:27:04 · 121 阅读 · 1 评论 -
Java面试专题-多线程篇(1)
Q:线程 和 进程有什么区别?进程:进程是程序运行资源分配的最小单位。进程内部有多个线程,会共享这个进程中的资源。线程:线程是CPU调度的最小单位。必须依赖进程而存在。特点: 线程的划分尺度小于进程,这使得多线程拥有高并发性; 进程在运行时各自内存单元相互独立,线程之间内存共享; 多线程开发可以拥有更好的性能和用户体验。 (注意:多线程开发对于其他程序是不友好的,占据大量CPU资源。)Q:如何安全的终止线程?理解中断:...转载 2020-12-19 17:21:58 · 136 阅读 · 1 评论 -
任务的执行与线程池(上)
原文出处:https://mp.weixin.qq.com/s/p3JZERyZXnF8jR_3KKIGJA写作本文时参考了《java并发编程实战》、《java并发编程的艺术》、java源码以及一些博客文章,力求把这个专题的知识讲的足够全面,最重要的是通俗易懂,如文中有错误请与我联系。为保证你把这些知识完全掌握,最好使用电脑观看,投机取巧是学不到东西的,对自己诚实一点哈。任务执行的几种...原创 2019-05-30 21:38:03 · 146 阅读 · 0 评论 -
线程池实例:使用Executors和ThreadPoolExecutor
线程池负责管理工作线程,包含一个等待执行的任务队列。线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象。java.util.concurrent.executors提供了java.util.concurrent.executor接口的一个Java实现,可以创建线程池。下面是一个简单示例:首先创建一个Runable 类:WorkerT...转载 2019-05-28 16:50:18 · 212 阅读 · 1 评论 -
自定义线程执行任务和线程池执行任务的对比
1.自定义普通线程执行任务,设置出队列的任务供线程调用package com.thread;import java.util.Queue;import java.util.concurrent.ConcurrentLinkedQueue;/** * @author liuchj * @version 1.0 * @className MyThreadTask * @desc...原创 2019-05-29 17:19:40 · 321 阅读 · 0 评论 -
任务的执行与线程池(下)
自定义线程池如果由Executors的几个工具方法创建的线程池提供的执行策略不合你的胃口,你也可以自己动手设计一个定制版线程池。当然,这个定制不需要我们从头开始编写,设计java的大叔们已经为我们提供了一个ThreadPoolExecutor类,它实现了ExecutorService接口,代表着一个线程池,我们可以通过不同的构造方法参数来自定义的配置我们需要的执行策略,看一下这个类的构造方法:...原创 2019-06-02 23:59:21 · 405 阅读 · 0 评论 -
线程池深度剖析
王小二最近刚刚拿到了一家互联网公司的java研发的实习offer,激动的他很快便前往公司去实习了。赵铁柱是王小二的上司,开工的第一天便给王小二安排了一个需求,要求他开发一个功能,每天在指定的时间点运行各种各样的任务。王小二灵机一动,立马就想到了线程池。谷歌了一下,王小二直接将网上的代码copy到了公司的项目里面,然后提交转测。结果没想到在压测环节便出现了异常情况,于是赵铁柱便找到了王小二询问...转载 2019-09-27 09:55:36 · 392 阅读 · 1 评论 -
JUC学习笔记—从阿里Java开发手册学习线程池的正确创建方法
原文出处:https://www.cnblogs.com/javanoob/p/threadpool.html最近看阿里的 Java开发手册,上面有线程池的一个建议:【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。结合最近面试的经历,发现这条建议还是...原创 2019-05-30 16:45:01 · 131 阅读 · 0 评论 -
Java 之 JUC
原文出处:https://www.cnblogs.com/linkworld/p/7819270.html1. JUC 简介在 Java 5.0 提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中 的 Collection...原创 2019-05-30 16:33:14 · 1132 阅读 · 0 评论 -
Java多线程-Callable的Future返回值的使用
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /* * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnabl...原创 2019-05-10 08:35:40 · 381 阅读 · 0 评论 -
Java线程池简要分析
Java中可使用java.util.concurrent包中ThreadPoolExecutor作为线程池。JDK本身提供4种特定的线程池模板供我们使用,当然,我们可以按需创建自定义的ThreadPoolExecutor,但是大多数情况下,这四种已经可以满足需求。下面分别解释。基础概念BlockingQueue:线程池底层都包含一个BlockingQueue,这关系到每个线程池的特性,所以...转载 2019-05-26 16:46:16 · 150 阅读 · 0 评论 -
继承Thread的子线程启动方式对比
方式一:public class TestExtendsThread extends Thread { @Override public void run() { System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName()); ...原创 2019-05-27 14:20:24 · 117 阅读 · 0 评论 -
Executors详解
在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程...转载 2019-05-30 09:58:58 · 11363 阅读 · 0 评论 -
线程实现Callable接口和Runnable接口的对比
1.线程任务是继承Runnable接口的方式package com.thread;/** * @author liuchj * @version 1.0 * @className MyThreadTest * @description //TODO * @date 2019/5/29 **/import java.util.ArrayList;import java....原创 2019-05-30 11:17:56 · 723 阅读 · 0 评论 -
多线程CompletionService接口之实现类ExecutorCompletionService
原有Future 对象获取任务的执行状态:package com.thread; /** * @author liuchj * @version 1.0 * @className MyThreadTest * @description //TODO * @date 2019/5/29 **/ import java.util.ArrayList;import java....原创 2019-05-30 11:37:21 · 292 阅读 · 0 评论 -
周期性线程池newScheduledThreadPool详解
线程池支持定时以及周期性执行任务,创建一个corePoolSize为传入参数,最大线程数为整形的最大数的线程池 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSi...原创 2019-05-30 15:55:41 · 43699 阅读 · 7 评论 -
Java多线程-Callable的Future返回值的使用
一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中:public interface Executor { void execute(Runnable command);}这个方法是没有返回值的,而且只接受Runnable。那么像得到线程的返回值怎嘛办呢?在ExecutorService接口中能找到这个方法:<T> ...原创 2019-05-09 17:57:08 · 1022 阅读 · 0 评论