【商城实战】06-进阶篇-异步处理
【商城实战】06-进阶篇-异步处理
Last edited 2022-9-27
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接口可以获取线程的返回结果。当然这三种方式都不能控制我们的资源,线程池可以控制资源。

二、线程池详解

三、CompletableFuture

  • 微服务
  • spring-cloud-alibaba
  • 商城
  • 【商城实战】11-进阶篇-分布式事务【商城实战】04-进阶篇-缓存与分布式锁