![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaSE
文章平均质量分 53
JavaSE
sql2008help
这个作者很懒,什么都没留下…
展开
-
JDK8-2-流(3)- 流操作(2)
例如筛选每种类型菜肴中最高卡路里的菜肴。原创 2023-06-19 17:28:16 · 121 阅读 · 0 评论 -
JDK8-2-流(2.3)- 流操作-reduce (归约)
reduce 可以把一个流中的元素组合起来,例如可以计算一组数的总和。原创 2023-06-18 11:17:47 · 145 阅读 · 0 评论 -
JDK8-2-流(2.2)- 流操作-flatMap
flatMap (流的扁平化处理)原创 2023-06-16 11:45:39 · 160 阅读 · 0 评论 -
JDK8-2-流(2.1)- 流操作-distinct
注意:对象去重需要重写 equals 和 hashCode 方法(默认对象 equals 方法比较的是对象内存地址是否一致),由 distinct 内部具体实现类 java.util.stream.DistinctOps 可以看出这点。IDEA 如何自动生成 equals 和 hashCode 方法空白处右键选择 Generate 或者Alt + Ins 快捷键使用 filter 方法去重。原创 2023-06-15 12:08:08 · 212 阅读 · 0 评论 -
JDK8-2-流(2)- 流操作
上篇中简单介绍了什么是流以及使用流的好处,本篇主要介绍流的操作类型以及如何操作。原创 2023-06-18 11:40:51 · 249 阅读 · 0 评论 -
JDK8-2-流(1)-简介
流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现),可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码!原创 2023-06-14 11:49:54 · 488 阅读 · 0 评论 -
JDK8-1-Lambda表达式(5)-复合 Lambda 表达式
Function<?super T,?@Override@Override相当于 Comparator.comparing 帮我们实例化一个 Comparator ,这个方法入参为 Functionreversed。原创 2023-06-10 17:19:58 · 740 阅读 · 0 评论 -
JDK8-1-Lambda表达式(4)-方法引用
下例中,date 为 Date 类型的对象,supplier 接收的 Lambda 表达式方法体中返回时间戳。原创 2023-06-09 13:50:11 · 41 阅读 · 0 评论 -
JDK8-1-Lambda表达式(3)-函数式接口
有且仅有一个抽象方法的接口称为函数式接口,中接口就是一个函数式接口,Java 8中引入的函数式接口定义在 java.util.function 包下。原创 2023-06-09 11:46:05 · 532 阅读 · 0 评论 -
JDK8-1-Lambda表达式(2)-方法传递(行为参数化)
Java 8 允许程序将方法作为参数传递,先看一个例子:以下,filterGreenApples ,filterHeavyApples 方法分别表示过滤出不同类型的苹果从代码中可以看出,filterGreenApples 与 filterHeavyApples 方法代码几乎一模一样,仅仅只有 if 条件中的代码有区别,既然这样为什么不可以将筛选的代码抽出,过滤的部分作为公共逻辑呢。原创 2023-06-07 17:25:10 · 968 阅读 · 0 评论 -
JDK8-1-Lambda表达式(1)-简介
Lambda也称为匿名函数,是 JDK8 的新特性之一,它允许程序将方法作为值传递(类似JS中的回调方法),相比 JDK8 之前的代码,Lambda语法更简洁。::是Java 8中的方法引用语法(即“把这个方法作为值”)将其传给listFiles方法。原创 2023-06-07 16:44:57 · 37 阅读 · 0 评论 -
JavaSE-线程池(6)- 建议使用的方式
虽然JDK Executors 工具类提供了,但一般建议自定义线程池参数,下面是阿里巴巴开发手册给出的理由:另外Spring也提供了线程池的实现,比如 ThreadPoolExecutor。原创 2023-02-19 21:52:20 · 888 阅读 · 0 评论 -
JavaSE-线程池(5)- ThreadPoolExecutor常用方法
ExecutorService 接口中定义的方法,给定一组任务,在所有任务执行完成时返回一个 Futures 列表,其中包含它们的状态和结果。原创 2023-02-27 16:51:08 · 296 阅读 · 0 评论 -
JavaSE-线程池(4)- JDK Executors提供的创建线程池的方法
该线程池只有一个线程处理任务如下例:有8个任务被该线程池处理每个任务都是顺序执行的。原创 2023-02-18 13:19:25 · 304 阅读 · 0 评论 -
JavaSE-线程池(3)- 线程池参数-拒绝策略
实现 RejectedExecutionHandler 接口即可,在 rejectedExecution 方法中可以记录没被处理的任务日志,也可以记录到消息队列中。原创 2023-02-15 23:30:32 · 113 阅读 · 0 评论 -
JavaSE-线程池(2)- 线程池参数
在上篇中提到创建线程池可以使用工具类中的静态方法,比如使用方法可以创建一个拥有固定线程数的线城池,这个方法内部实例化了线程池中保留的最少线程数量,除非调用 ThreadPoolExecutor 实例方法 allowCoreThreadTimeOut(true),否则即使核心线程空闲也不会被回收线程池中允许的最大线程数超过corePoolSize 数量的非核心线程在终止之前等待的最大时长当核心线程处于非空闲状态并且有新的任务提交时,线程池会将这些任务放入等待队列中。原创 2023-02-15 23:31:36 · 141 阅读 · 0 评论 -
JavaSE-线程池(1)- 线程池概念
实现 ExecutorService 接口,提供ExecutorService执行方法的默认实现。原创 2023-02-11 17:55:24 · 692 阅读 · 0 评论 -
JDK8-11-CompletableFuture(9)- handle 方法使用
下例中,有一个计算除法的方法 divisionOperation,在main 方法中有两次调用,第一次正常调用,第二次产生异常,原创 2022-10-29 16:53:34 · 251 阅读 · 0 评论 -
JDK8-11-CompletableFuture(8)- applyToEither 方法使用
906路公交与539公交同时行驶在路上,没有先后顺序,906路耗时 5000,539路耗时4000,显然539路先到达,最终 busCF.join 返回结果为 “539路公交”,可见。方法作用是返回两个任务中最先完成的任务结果。原创 2022-10-23 11:56:57 · 701 阅读 · 0 评论 -
JDK8-11-CompletableFuture(7)- thenApply,thenApplyAsync方法使用
回到顾客点餐,厨师炒菜打饭的例子:1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜4.厨师打饭(假设没有服务员)5.顾客开始吃饭。原创 2022-10-23 12:33:13 · 1730 阅读 · 1 评论 -
JDK8-11-CompletableFuture(6)- thenCombine方法使用
假设顾客进入餐馆的时间比较早,直到顾客点完餐后才开始煮饭,场景步骤如下(/ 表示同时进行):1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜 / 4.服务员煮饭 / 5.顾客玩手机6.顾客等饭菜做好后开始吃饭用程序模拟如下:使用两个异步任务 chefCF ,waiterCF 分别处理炒菜和煮饭这两个动作,使用 chefCF.get(), waiterCF.get() 等待任务执行完成。原创 2022-10-16 20:34:15 · 566 阅读 · 0 评论 -
JDK8-11-CompletableFuture(5)- thenCompose 方法使用
Compose 意思为组成,thenCompose 意思为一个任务执行完后再执行下一个任务,thenCompose方法接收的入参为 Function,Function入参为上一个任务的结果(即dish),出参为 CompletionStage 的子类,此例中为 CompletableFuture。虽然这种写法可以完成本例的工作,但是代码存在嵌套,而且 CompletableFuture 已经提供API用来连接两个异步任务。如下所示,厨师和服务员的工作分为两个线程执行。3.厨师按照顾客所选菜品开始炒菜。原创 2022-10-16 18:10:00 · 850 阅读 · 0 评论 -
JDK8-11-CompletableFuture(4)- supplyAsync 方法使用
生活中有一些多线程的例子,例如顾客去餐馆点餐,大致可以分为如下几个步骤:1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜4.厨师打饭(假设没有服务员)5.顾客开始吃饭,用于模拟耗时和打印当前时间戳和线程信息从执行结果中可以看出,main线程处理顾客相关动作,ForkJoinPool.commonPool-worker-1 线程处理厨师相关动作,从时间戳可以看出顾客玩手机和厨师开始炒菜都是1665891660537 ,符合异步处理场景。原创 2022-10-16 13:16:25 · 995 阅读 · 0 评论 -
JDK8-11-CompletableFuture(3)- 异常处理,completeExceptionally使用(如何让主线程捕获其他线程产生的异常)
运行结果:注意看,由于传入空名称的产品,程序产生异常,产生异常的线程名为 Thread-0,而程序并没有结束,主线程任然阻塞在 get 方法这里,如果不进行其他处理,程序会一直阻塞。原创 2022-10-16 11:08:18 · 3968 阅读 · 0 评论 -
JDK8-11-CompletableFuture(2)- CompletableFuture基本用法
同步调用测试方法,主线程首先调用 Shop getPrice 方法获取商品价格,然后再去做耗时 500 ms 的其他事情。如下,主线程异步处理商品计算逻辑,不立即获取结果,然后再开始做其他事情(耗时500 ms),等这件事处理完后再获取商品结果,同步调用的测试结果如下,由于计算商品价格 1000 ms,做其他事情 500 ms,所以总的耗时 1500 ms 左右。如下,整个过程耗时 1148 ms,明显异步处理要比同步处理耗时要少。:店铺中具体计算价格的方法,sleep 1秒,模拟耗时。原创 2022-10-14 21:42:47 · 550 阅读 · 0 评论 -
JDK8-11-CompletableFuture(1)
由图可知 main线程 首先提交异步任务,然后执行本线程的任务(doSomethingElse ),当main线程任务执行完后,使用get方法获取异步线程执行结果,此时 异步任务 doSomeLongComputation 还未执行完成,所以 main 线程会阻塞,直到异步任务结果返回或者超时此例引用自 Java 8 实战11.1。原创 2022-10-11 23:11:58 · 165 阅读 · 0 评论 -
JDK8-10-Optional(1)
显然这种方式也不好,return “” 同一段代码出现次数太多,原创 2022-08-27 17:17:39 · 139 阅读 · 0 评论 -
JavaSE-多线程(14)- ThreadLocal 使用及源码解析
JavaSE-多线程(14)- ThreadLocal 使用及源码解析ThreadLocal 称为线程变量,在 ThreadLocal 中定义的变量被当前线程独有,看下例:类 ThreadLocalTest 中 有一个ThreadLocal 属性,它用来保存 User 对象,线程 t1 和线程 t2 各自调用 ThreadLocalTest setUser 方法给 ThreadLocal 赋值,然后调用 run 方法取出 ThreadLocal 中的User对象,从输出结果中可以看出,t1 t2原创 2022-04-18 20:54:44 · 126 阅读 · 0 评论 -
JavaSE-多线程(13)- ReentrantLock,AQS源码
JavaSE-多线程(13)- ReentrantLock,AQS源码以如下实例讲解,有两个线程 t1 ,t2 ,它们同时访问 ReentrantLock5 对象的 run 方法,run 方法中打印当前正在执行的线程名,在run方法开始时对 Lock 对象加锁,访问完后释放锁:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Reentran原创 2022-04-18 15:56:40 · 283 阅读 · 0 评论 -
JavaSE-多线程(12)- wait notify
JavaSE-多线程(12)- wait notify程序中有一个容器,现需要实现如下内容:线程1实现向容器添加10个元素,线程2实现元素个数监控,当添加到第5个元素时,线程2给出提示并结束实现方式1import java.util.ArrayList;import java.util.List;/** * 线程1实现向容器添加10个元素,线程2实现元素个数监控,当添加到第5个元素时,线程2给出提示并结束 */public class VolatileTest3 { //保证线原创 2021-11-22 23:38:54 · 90 阅读 · 0 评论 -
JavaSE-多线程(11)- LockSupport
JavaSE-多线程(11)- LockSupport使用LockSupport 类可使线程暂停,请看下例:例1线程 t1 执行 LockSupportTest 类run方法,在run方法中,每隔1秒输出一次 i 的值,一共输出10次,在i等于5时暂停线程,主线程睡眠8秒后,调用 activate 方法(实际调用 LockSupportTest 对象即锁的notify方法),t1线程继续执行package com.hs.example.base.multithread.day01;public原创 2021-11-21 15:23:21 · 480 阅读 · 0 评论 -
JavaSE-多线程(9)- Semaphore
JavaSE-多线程(9)- Semaphore解释semaphore前先看下以下例子:例1有10个线程同时执行SemaphoreTest任务,从执行结果可以看出,10个线程是同时执行的,等待一段时间后结束。package com.hs.example.base.multithread.day01;public class SemaphoreTest implements Runnable { @Override public void run() { try原创 2021-11-20 21:24:30 · 443 阅读 · 0 评论 -
JavaSE-多线程(8)- ReadWriteLock
JavaSE-多线程(8)- ReadWriteLock以下例子中多个线程同时对count进行读写,读方法和写方法都等待1秒,并且读写方法都使用了ReentrantLock重入锁,通过CountDownLatch工具类让主线程等待读写线程结束,最后程序输出执行时间为12秒左右例1package com.hs.example.base.multithread.day01;import java.util.concurrent.CountDownLatch;import java.util.conc原创 2021-11-20 17:51:37 · 256 阅读 · 0 评论 -
JavaSE-多线程(7)- CyclicBarrier
JavaSE-多线程(7)- CyclicBarrierCyclicBarrier 直译为循环的关卡,import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierTest implements Runnable { private CyclicBarrier cyclicBarrier; CyclicB原创 2022-04-16 15:55:03 · 111 阅读 · 0 评论 -
JavaSE-多线程(6)- CountDownLatch
JavaSE-多线程(6)- CountDownLatchCountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行。join 方法解释 CountDownLatch 前,先看一个Join 方法的例子:例1在下例中,有100个线程同时执行,每个线程在主线程都调用了join方法,最终结果为主线程输出 main start… 后100个线程同时执行,最后主线程输出 main end…package com.hs.example.base.multith原创 2021-11-14 19:37:56 · 204 阅读 · 0 评论 -
JavaSE-多线程(5)- Reentrant Lock (可重入锁)1
JavaSE-多线程(5)- Reentrant Lock (可重入锁1)简单解释线程A 在执行加锁方法 m 时获得锁 L,如果在m方法中调用的 方法 n 同时需要获得锁 L,那么不会出现互斥现象,即同一线程可重入同一锁对象不同线程之间无法重入锁例1下例中,m1方法每隔1秒打印一次i值,共打印10次,m2方法直接输出一段文字,t1线程调用ReentrantLock1对象m1方法,主线程 睡眠 1秒后 t2 线程启动调用 ReentrantLock1 对象m2方法,由打印结果可知,t2线程在t1线程原创 2021-11-13 01:12:52 · 116 阅读 · 0 评论 -
JavaSE-多线程(4)- CAS
JavaSE-多线程(4)- CASCAS (CompareAndSwap)举例例1:在此例中,有 THREAD_COUNT (20)个数量的线程调用 AtomicTest 对象m方法,对属性count进行自增操作,最后在主线程打印count的最终结果为20,由于存在多线程多并发访问count,所以在自增操作前使用synchronized关键字对AtomicTest对象进行了锁定。package com.hs.example.base.multithread.day01;public class原创 2021-11-13 00:23:22 · 678 阅读 · 0 评论 -
JavaSE-多线程(3)- volatile
JavaSE-多线程(3)- volatilevolatile 解释volatile 字面意思为 易变的,解释具体作用前可先看下以下例子:VolatileTest类中有一个running 变量控制run方法执行,t1 线程启动后 run 方法一直执行,主线程在等待2秒后改变running 值,试图让 t1 线程结束运行,但通过运行结果发现效果并没有达到例1)package com.hs.example.base.multithread.day01;public class VolatileT原创 2021-11-06 13:18:23 · 294 阅读 · 0 评论 -
JavaSE-多线程(2.2)- 锁举例2(Reentrant Lock )
JavaSE-多线程(2.2)- 锁举例2(Reentrant Lock )package com.hs.example.base.multithread.day01;import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/**原创 2021-11-28 18:10:54 · 112 阅读 · 0 评论 -
JavaSE-多线程(2.1)- 锁举例1(synchronized)
JavaSE-多线程(2.1)- 锁举例1package com.hs.example.base.multithread.day01;import java.util.LinkedList;/** * 自定义容器,固定容量最大值为MAX_COUNT,运行多线程并发put和get * @param <T> */public class SynchronizedTest4<T> { final LinkedList<T> lists = new L原创 2021-11-26 00:38:07 · 318 阅读 · 0 评论