date
Jul 6, 2022
type
Post
status
Published
slug
msb-mac-mall-6
summary
概要:1 线程的实现方式;2 线程池详解;3 CompletableFuture使用
tags
微服务
spring-cloud-alibaba
商城
category
商城实战
password
Property
Sep 27, 2022 03:40 AM
icon
异步处理
一、线程的实现方式
1. 线程的实现方式
1.1 继承Thread
class ThreadDemo01 extends Thread{ @Override public void run() { System.out.println("当前线程:" + Thread.currentThread().getName()); } }
1.2 实现Runnable接口
class ThreadDemo02 implements Runnable{ @Override public void run() { System.out.println("当前线程:" + Thread.currentThread().getName()); } }
1.3 Callable接口
class MyCallable implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("当前线程:" + Thread.currentThread().getName()); return 10; } }
public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println("main方法执行了..."); ThreadDemo01 t1 = new ThreadDemo01(); t1.start(); ThreadDemo02 t2 = new ThreadDemo02(); new Thread(t2).start(); new Thread(()->{ System.out.println("当前线程:" + Thread.currentThread().getName()); }).start(); // 通过Callable接口来实现 FutureTask 本质上是一个Runnable接口 FutureTask futureTask = new FutureTask(new MyCallable()); Thread t3 = new Thread(futureTask); t3.start(); // 阻塞等待子线程的执行完成,然后获取线程的返回结果 Object o = futureTask.get(); System.out.println("o = " + o); System.out.println("main方法结束了..."); }
2. 线程池的实现
上面的三种获取线程的方法是直接获取,没有对线程做相关的管理,这时可以通过线程池来更加高效的管理线程对象。
// 定义一个线程池对象 private static ExecutorService service = Executors.newFixedThreadPool(5);
然后我们就可以通过这个线程池对象来获取对应的线程
service.execute(new Runnable() { @Override public void run() { System.out.println("线程池--》当前线程:" + Thread.currentThread().getName()); } });
3. 创建线程的区别
通过上面的介绍我们发现创建线程的方式
- 继承Thread对象
- 实现Runnable接口
- 实现Callable接口
- 线程池
继承Thread对象和实现Runnable接口没有办法获取返回结果的,实现Callable接口可以获取线程的返回结果。当然这三种方式都不能控制我们的资源,线程池可以控制资源。