1.0 线程回顾
1.1 初始化线程的4中方式
- 继承Thread
- 实现Runnable接口
- 实现Callable 接口+FutureTask (可以拿到返回结果,可以处理异常)
- 线程池
通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。
import java.util.concurrent.*;
public class ThreadTest {
public static ExecutorService service = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main......start...");
// Thread01 thread01 = new Thread01();
thread01.start(); //启动线程
// Runnable01 runnable01 = new Runnable01();
// new Thread(runnable01).start();
// FutureTask<Integer> futureTask = new FutureTask<>(new Callable01());
// new Thread(futureTask).start();
// //阻塞等待 整个线程执行完成,获取返回结果
// Integer integer = futureTask.get();
// System.out.println("main......end...."+integer ); //这个最后执行
//将所有的多线程异步任务都交给线程池执行,这样不用一个任务申请一个线程了
// new Thread(()-> System.out.println("hello")).start();
//当前系统中只有一二个,每个异步任务直接提交给线程池
service.execute(new Runnable01());
System.out.println("main......end....");
}
public static class Thread01 extends Thread{
@Override
public void run() {
System.out.println("dangqiang线程" +Thread.currentThread().getId());
int i =10 /2;
System.out.println("运行结果"+i);
}
}
public static class Runnable01 implements Runnable{
@Override
public void run() {
System.out.println("dangqiang线程" +Thread.currentThread().getId());
int i =10 /2;
System.out.println("运行结果"+i);
}
}
public static class Callable01 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("dangqiang线程" +Thread.currentThread().getId());
int i =10 /2;
System.out.println("运行结果"+i);
return i;
}
}
}
main......start...
main......end....
dangqiang线程11
运行结果5
方式1和2 : 主线程无法获取线程的运算结果,不适合当前场景
方式3: 主进程可以获取线程的运算结果,但是不利于控制服务器中的线程资源.可以导致服务器的资源耗尽
方式4: 通过以下二种方式初始化线程池
Executors.newFiexedThreadPool(3);
//或者
new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime,TimeUnit unit,workQueue,threadFactory,handler)
corePoolSize:核心线程数.创建好后准备就绪的线程数量(未start),就等待来接受异步任务去执行
maximumPoolSize:最大线程数量,控制资源
keepAliveTime:存活时间,正在运行线程数量大于核心线程数量,释放空闲线程
TimeUnit :时间单位
workQueue:阻塞队列,任务任务很多,将目前多的任务放到队列里面,只要有线程空闲就取队列里面任务执行
threadFactory:线程的创建工厂
handler:如果队列满了,按照我们指定的拒绝策略拒绝执行任务
1.2 线程池
2.CompletableFuture 异步编排
2.1 启动异步任务
public static ExecutorService service = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main....start.....");
// CompletableFuture.