# CoreJava **Repository Path**: sanwen87/CoreJava ## Basic Information - **Project Name**: CoreJava - **Description**: Java核心基础 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-13 - **Last Updated**: 2022-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java.util.Objects.requireNonNull(T obj) 检查指定的对象引用是否为空。此方法主要用于在方法和构造函数中进行参数验证 ``` public Foo(Bar bar) { this.bar = Objects.requireNonNull(bar); } ``` # java.util.Objects.equals(Object a, Object b) 检查对象是否相等,包括包装类在内都建议使用Objects#equals方法,不推荐使用Object#equals方法(Object的equals方法存在NPE风险) ## Java7并发编程实战手册 ### 多线程输出乘法口诀表 ``` base.thread_JUC2.chapter01.demo001.Calculator 每个线程任务都不一样,Thread-0负责从1开始(1-9)打印,Thread-1负责从2开始(1-9)打印,Thread-2负责从3开始(1-9)打印,以此类推直到 Thread-8结束。 每个Calculator对象中任务负责循环(1-9)次 ``` ### 线程优先级设置 ``` base.thread_JUC2.chapter01.demo002.TestCase ``` ### 线程被打断 ``` base.thread_JUC2.chapter01.demo003.PrimeGenerator isInterrupted()推荐使用该方法判断线程是否被打断,该方法不会重置线程 interrupted 属性为 false。而interrupted()方法会将线程状态重置为 false。 ``` ### 线程休眠和恢复 ``` base.thread_JUC2.chapter01.demo005.FileClock 线程休眠过程被打断,并恢复执行 ``` ### 等待线程的终止 ``` base.thread_JUC2.chapter01.demo006.DataSourcesLoader 主线程必须等待thread1、thread2结束才能继续执行主线程任务 ``` ### 守护线程的创建和运行 ``` base.thread_JUC2.chapter01.demo007.CleanerTask ``` ### 线程不可控异常的处理 ``` base.thread_JUC2.chapter01.demo008.ExceptionHandler ``` ### 线程局部变量的作用 ``` base.thread_JUC2.chapter01.demo009.SafeTask ThreadLocal的使用,E从属于每个线程 ``` ### 线程组使用 ``` base.thread_JUC2.chapter01.demo010.SearchTask 线程组去完成任务,只要组中有一个线程完成任务,就结束组中其余线程任务 ``` ### 组中不可控异常 ``` base.thread_JUC2.chapter01.demo011.MyThreadGroup ``` ### 使用工厂创建线程组 ``` base.thread_JUC2.chapter01.demo012.MyThreadFactory 通过工厂创建的线程便于统一修改创建的线程对象,比如创建个性化线程,如本例中使用一个特殊的格式作为线程名;统计线程数,限制创建的线程数量;对生成的线程进行校验等等; 工厂类的好处是:便于改变创建对象的方式;为有限资源创建有限数目对象;便于为创建的对象生成统计数据; ``` ### synchronized 实现方法同步 ``` base.thread_JUC2.chapter02.demo01.Account ``` ### 非this锁解决多线程安全问题 ``` base.thread_JUC2.chapter02.demo02.Cinema 两把锁 Cinema中的同步实现是在方法内部加 synchronized 关键字,而不是给方法加上 synchronized 关键字,提高了效率。 如果 synchronized 加在方法上,将导致t1线程sellTickets1(拿到了this锁) 而导致t2不能进行sellTicketsX。 ``` ### 同步代码中使用条件 ``` base.thread_JUC2.chapter02.demo03.EventStorage 切记不要将notifyAll等唤醒语句放在条件语句内部,否则,不达条件会导致进入wait的线程一直wait 数据结构:https://zhuanlan.zhihu.com/p/28346365 ArrayList:底层是数组,在内存中是顺序排列的,是Java中线性表中顺序表的体现; 栈:Stack是栈在Java中的实现,先进后出,是一种操作受限制的线性表,其限制是仅允许在线性表的尾部进行添加删除,这一端被称为栈顶。(栈可以是单向链表实现) 队列:Queue是队列在Java中的实现,先进先出,也是一种操作受限制的线性表,只能从头删,从尾加。(队列可以是单向或双向链表实现) ``` ### 锁实现同步 ``` base.thread_JUC2.chapter02.demo04.PrintQueue Lock 实现同步代码块 ``` ### 读写锁实现同步 ``` base.thread_JUC2.chapter02.demo05.PricesInfo ``` ### 锁的公平性 ``` base.thread_JUC2.chapter02.demo06.PrintQueue Lock的lock()、unlock()可以设置公平性,而tryLock()不受公平性影响. ``` ### 在锁中使用多条件 ``` base.thread_JUC2.chapter02.demo07.Buffer ArrayBlockingQueue 类提供此功能,因此没有理由实现 Buffer 此示例类 ``` ### 资源的并发访问控制 ``` https://ifeve.com/monitors-java-synchronization-mechanism/ base.thread_JUC2.chapter03.demo01.PrintQueue 中 new Semaphore(N) 中N表示同时允许N个线程访问临界区共享资源 ``` ### 同时允许N线程访问共享资源 ``` base.thread_JUC2.chapter03.demo02.PrintQueue 规定同时允许3个线程访问共享资源:semaphore=new Semaphore(3); ``` ### 等待多个并发事件的完成 ``` base.thread_JUC2.chapter03.demo03.Videoconference 视频会议等待参会者们聚齐 ``` ### 等待多个并发完成后,集合统计结果 ``` base.thread_JUC2.chapter03.demo04.MatrixMock 一个 10000 * 1000 的矩阵,分5个线程任务完成,每个线程统计2000行矩阵数据,如果行中出现数字6的计数器就+1。统计这个矩阵中有多少个数字6 ``` ### 并发阶段任务,每个阶段用一线程去执行 ``` base.thread_JUC2.chapter03.demo05.FileSearch 并发多阶段任务 ``` ### 并发阶段任务中的阶段切换 ``` base.thread_JUC2.chapter03.demo06.Student 5个学生进行3轮测试,每轮进行测试,待每轮结束进行下一轮测试 ``` ### 并发任务间的数据交换 ``` ``` ### 线程执行器 #### 线程执行器 ``` base.thread_JUC2.chapter04.demo01.Task ThreadPoolExecutor通过构造器创建比较复杂,通过newCachedThreadPool()创建。等到熟练使用时还是推荐ThreadPoolExecutor构造器创建线程池,方便控制,不至于出现资源 不够,连问题都不知道出在什么地方 仅当线程的数量合理或者线程只会运行很短的时间时适合采用这种方式创建执行器。 ``` #### 固定大小线程池 ``` base.thread_JUC2.chapter04.demo02.Task Executors.newFixedThreadPool(5) 创建固定大小的线程池执行器 ``` #### 执行器返回任务结果 ``` base.thread_JUC2.chapter04.demo03.FactorialCalculator ``` #### 执行器返回 ``` Executors.newFixedThreadPool(5).invokeAny(taskList) 模拟拿到并发任务第一个返回true的任务 ``` #### 处理所有并发任务结果 ``` base.thread_JUC2.chapter04.demo04.Task ``` #### 在执行器中延时执行任务 ``` base.thread_JUC2.chapter04.demo05.TestCase pool.schedule(task, i, TimeUnit.SECONDS);//延时i秒执行任务 ``` #### 周期性执行任务 ``` base.thread_JUC2.chapter04.demo06.Main 延时固定时间开始执行任务,不管上一次任务执行结束与否,开启执行下一轮任务 base.thread_JUC2.chapter04.demo07.Main 延时固定时间开始执行任务,开启执行下一轮任务必须要等上一轮任务完成后间隔固定时间。 ``` #### 取消执行器中任务 ``` base.thread_JUC2.chapter04.demo08.Main ``` #### 执行器中任务的后续操作 ``` base.thread_JUC2.chapter04.demo09.ResultTask ``` #### Fork/Join线程池 ``` base.thread_JUC2.chapter05.demo01.Task ```