// 正确的函数式接口 @FunctionalInterface public interface TestInterface { // 抽象方法 public void sub(); // java.lang.Object中的public方法 public boolean equals(Object var1); // 默认方法 public default void defaultMethod(){ } // 静态方法 public static void staticMethod(){ } } // 错误的函数式接口(有多个抽象方法) @FunctionalInterface public interface TestInterface2 { void add(); void sub(); }
方法修饰符 default
目的是让接口可以拥有具体的方法,让接口内部包含了一些默认的方法实现 如果一个类、类属变量及方法没有用任何修饰符 (即没有用public、protected及private中任何一种修饰) 则其访问权限为default(默认访问权限)
Callable&Future
Callable
Future
- cancel(boolean mayInterruptIfRunning)
取消任务 参数:是否立即中断任务执行,或者等等任务结束
- isCancelled()
任务是否已经取消,若已取消,返回true 若计算还没有开始,它被取消且不再开始。 若计算处于运行之中,那么如果mayInterrupt参数为true,它就被中断。
- isDone()
任务是否已经完成。包括任务正常完成、抛出异常或被取消,都返回true
- V get() throws InterruptedException, ExecutionException
等待任务执行结束,获得V类型的结果。 InterruptedException: 线程被中断异常, ExecutionException: 任务执行异常, 如果任务被取消,还会抛出CancellationException
- V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。 如果计算超时,将抛出TimeoutException 设置了超时时间可以防止程序无限制的等待future的返回结果
线程池
核心类
Executor
Executor类族是基于生产者-消费者思想设计的, 提交任务相当于生产者生产任务, 而执行任务相当于消费者消费任务
ExecutorService
继承Executor 添加了一些用于生命周期管理的方法
- shutdown()
等待已经提交的任务完成
- shutdownNow()
表示立即关闭
- isShutdown和isTerminated
判断是否关闭或者终止
- 三个submit
用于提交的任务,可以用Runnable作为任务,也可以用Callable作为任务
- 工厂类Executors
用于创建线程池
1、newFixedThreadPool
小结
Executor为了解决多线程任务调度的问题,可以合理平衡系统吞吐量与内存管理。 Executor是一个最顶层的接口,为了更好管理Executor的生命周期, 便扩展了ExceutorService接口,该类有具体实现类ThreadPoolExecutor和ScheduledExecutorService。 并通过工厂类Executors的几个静态方法来创建不同功用的线程池