一、线程异步
创建一个异步线程
public class AsyncThread extends Thread{ @Override public void run() { System.out.println("当前线程名称:" + this.getName() + ", 执行线程名称:" + Thread.currentThread().getName() + "我是异步线程"); }}
创建主线程,在主线程中创建异步线程执行异步线程,实现异步编程
public static void main(String[] args) { // 模拟业务流程 // ....... // 创建异步线程 AsyncThread asyncThread = new AsyncThread(); // 启动异步线程 asyncThread.start();}
优化:由于线程的频繁创建和销毁浪费系统资源,我们可以使用线程池进行优化
线程池的使用:创建一个类,将线程池设置为全局变量
puclic class Executor {private ExecutorService executor = Executors.newCachedThreadPool() ; public void runThread() throws Exception { executor.submit(new Runnable(){ @override public void run() { try { //要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试 Thread.sleep(10000); System.out.print("睡够啦~"); }catch(Exception e) { throw new RuntimeException("报错啦!!"); } } }); }}
执行线程时只需要创建执行对象调用执行方法就可以了
二、Future异步
Future异步性能较差不建议使用,由于Future异步获取线程结果会阻塞线程,所以性能较差,不建议使用
三、CompletableFuture异步
JDK1.8 中,Java 提供了 CompletableFuture 类,它是基于异步函数式编程。相对阻塞式等待返回结果,CompletableFuture 可以通过回调的方式来处理计算结果,实现了异步非阻塞,性能更优。
CompletableFuture 实现了 Future 和 CompletionStage 接口, 并提供了多种实现异步编程的方法,如supplyAsync, runAsync以及thenApplyAsync。
下面我们使用CompletableFuture来实现上面的例子:
CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> factorial(number));while (!completableFuture.isDone()) { System.out.println("CompletableFuture is not finished yet...");}long result = completableFuture.get();
我们不需要显式使用 ExecutorService,CompletableFuture 内部使用了 ForkJoinPool 来处理异步任务,这使得我们的代码变的更简洁。
四、SpringBoot @Async异步
在@Async注解之前,使用多线程需要使用JDK的原生方法,非常麻烦,当有了@Async之后就比较简单了。
首先,启动类添加@EnableAsync 注解,允许异步:
@SpringBootApplication@EnableAsyncpublic class StartApplication { public static void main(String[] args) { SpringApplication.run(StartApplication.class, args); }}
定义线程池
@Configuration@Slf4jpublic class ThreadPoolConfiguration { @Bean(name = "defaultThreadPoolExecutor", destroyMethod = "shutdown") public ThreadPoolExecutor systemCheckPoolExecutorService() { return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue(10000), new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(), (r, executor) -> log.error("system pool is full! ")); }}
在异步处理的方法上添加注解 @Async
,当对 execute 方法
调用时,通过自定义的线程池 defaultThreadPoolExecutor
异步化执行 execute 方法
@Servicepublic class AsyncServiceImpl implements AsyncService { @Async("defaultThreadPoolExecutor") public Boolean execute(Integer num) { System.out.println("线程:" + Thread.currentThread().getName() + " , 任务:" + num); return true; } }
用 @Async 注解标记的方法,称为异步方法。在spring boot应用中使用 @Async 很简单:
调用异步方法类上或者启动类加上注解 @EnableAsync
在需要被异步调用的方法外加上 @Async
所使用的 @Async 注解方法的类对象应该是Spring容器管理的bean对象;
不知道咋用
来源地址:https://blog.csdn.net/a18372016358/article/details/129530991