目录
多线程与高并发(七)
Callable、Future、FutureTask
callable类似于Runable --> call() 类似于 run(),但是又返回值;
Future 可以理解为将来得到的一个结果,配合callable的线程。可以理解为callable本身是个任务,任务通过线程池中的线程执行,执行的结果放在Future里
步骤:
1)任务类实现Callable接口
2)创建线程池:ExecutorService es = Executors.newCachedThreadPool();
3)执行任务:chuju cj = new chuju();Future<Boolean> future = es.submit(cj);
4)获取子线程中任务的执行结果:future.get()
FutureTask:本身是一个task,又实现了future,所以这两者的功能都有
public static void main(String[] args) throws InterruptedException, ExecutionException { FutureTask<Integer> task = new FutureTask<>(()->{ TimeUnit.MILLISECONDS.sleep(500); return 1000; }); //new Callable () { Integer call();} new Thread(task).start(); System.out.println(task.get()); //阻塞 }
CompletableFuture:用来管理多个Future的结果,比如说将多个Future组合,等所有Future执行完再进行某些操作。 如:CompletableFuture.allOf(futureTM, futureTB, futureJD).join();
线程池
线程池分类
线程池维护两个部分,一个是线程集合,一个是任务任务队列
ThreadPoolExcutor线程池
详解线程池:自定义线程池,JDK自带线程池,ForkJoin,源码解析等(一)
7个参数(背)
Java线程池七个参数详解_ye17186的博客-CSDN博客_java线程池参数
如果还没没有到核心线程数:提交一个任务到线程池时,线程池会创建一个新的线程来执行任务。注意: 即使有空闲的基本线程能执行该任务,也会创建新的线程。
SynchronousQueue
是不存储任务的,新的任务要么立即被已有线程执行,要么创建新的线程执行。
public class T05_00_HelloThreadPool {
static class Task implements Runnable {
private int i;
public Task(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Task " + i);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "Task{" +
"i=" + i +
'}';
}
}
public static void main(String[] args) {
ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4,
60, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 8; i++) {
tpe.execute(new Task(i));
}
System.out.println(tpe.getQueue());
tpe.execute(new Task(100));
System.out.println(tpe.getQueue());
tpe.shutdown();
}
}
注意点,阿里开发手册=华山版本
1,线程资源必须通过线程池提供
2,线程池不允许使用Excutors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
多线程与高并发变成(八)
详解线程池:自定义线程池,JDK自带线程池,ForkJoin,源码解析等(二)