Java多线程知识点

一、基础

1、线程管理

两种创建线程方式:继承Thread类、实现Runnable接口,区别:实现接口方式还可以继承其他类,多个线程共享一个target对象,一般推荐采用

线程的状态:new、runnable、blocked、waiting、time waiting、terminated

中断判断:isInterrupted()、interrupted()

中断控制:InterruptedException异常在检查到线程中断的时候会抛出

等待线程的终止:join()方法

守护线程:如果用户线程都退出了,守护线程也会退出,只要任何非守护线程还在运行,程序就不会终止。在start()之前调用setDaemon()方法,isDaemon()检查是不是守护线程

异常处理:setUncaughtExceptionnHandler()方法设置线程运行时异常处理器

局部变量的使用:ThreadLocal<T>接口,为每个线程存储了各自的属性值

线程分组:Thread第一个入参ThreadGroup

2、线程同步

两种基本同步机制:synchronized关键字,Lock接口

在同步代码中使用条件:wait()、notify()、notifyAll()

Lock允许分离读写操作,相比synchronized也有更好的性能,lock()、unlock()、tryLock()

读写锁:ReadWriteLock、ReentrantReadWriteLock

修改锁的公平性:fair

在锁中使用多条件:Condition、await()、signal()、signallAll()

3、线程同步辅助

资源并发访问控制:信号量Semaphore

等待多个并发事件的完成:CountDownLatch

在集合点的同步:CyclicBarrier

并发阶段任务的运行和阶段切换:Phaser

并发任务间的数据交换:Exchanger

4、线程执行器

创建执行器:使用ThreadPoolExecutor的四个构造器或Executors工厂类(如newCachedThreadPool())创建ThreadPoolExecutor对象

固定大小的线程执行器:Executors工厂类的newFixedThreadPool()

在执行器中执行任务并返回结果:让任务类实现Callable接口,在执行器中通过Future对象获得返回值

运行多个任务处理第一个结果:ThreadPoolExecutor的invokeAny()

运行多个任务处理所有结果:ThreadPoolExecutor的invokeAll()

延时执行任务:ScheduledThreadPoolExecutor

周期性执行任务:ScheduledThreadPoolExecutor的scheduleAtFixedRate()

取消任务:Future的cancel()

控制任务的完成:done()和isDone()

分离任务的启动与结果的处理:CompletionService和ReportRequest

执行被拒绝的服务:实现RejectedExecutionHandler接口的rejectedExecution()方法

5、Fork/Join框架

实现了工作窃取算法的线程池:ForkJoinPool,同步调用invoke(),异步调用execute()

执行的任务的基类:ForkJoinTask

任务没有返回结果需要实现:RecursiveAction,complete()

任务有返回结果需要实现:RecursiveTask,complete()

取消任务:ForkJoinPool的cancel()

6、并发集合

非阻塞式列表对应的实现类:ConcurrentLinkedDeque类

阻塞式列表对应的实现类:LinkedBlockingDeque类

用于数据生成或消费的阻塞式列表对应的实现类:LinkedTransferQueue类

按优先级排序列表元素的阻塞式列表对应的实现类:PriorityBlockingQueue类

带有延迟列表元素的阻塞式列表对应的实现类:DelayQueue类

非阻塞式可遍历映射对应的实现类:ConcurrentSkipListMap类

随机数字对应的实现类:ThreadLocalRandom类

原子变量对应的实现类:AtomicLong和AtomicIntegerArray类

二、场景

原文地址:https://www.cnblogs.com/ctxsdhy/p/8859559.html