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类
二、场景