当前位置: > 财经>正文

浅谈java开启异步线程的几种方法(@Async,AsyncManager,线程池) 银行里保险柜开启方式有几种

2023-09-06 09:29:49 互联网 未知 财经

浅谈java开启异步线程的几种方法(@Async,AsyncManager,线程池)

浅谈java开启异步线程的几种方法 整体描述实现方法一、注解@Async1. 添加注解2. 创建异步方法Service和实现类3. 调用异步方法 二、AsyncManager1. 创建AsyncManager类2. 创建一个耗时的操作类3. 执行异步操作 三、线程池1. 创建线程池2. 创建一个耗时的操作类3. 执行线程池 总结

整体描述

在java中异步线程很重要,比如在业务流处理时,需要通知硬件设备,发短信通知用户,或者需要上传一些图片资源到其他服务器这种耗时的操作,在主线程里处理会阻塞整理流程,而且我们也不需要等待处理结果之后再进行下一步操作,这时候就可以使用异步线程进行处理,这样主线程不会因为这些耗时的操作而阻塞,保证主线程的流程可以正常进行。 最近在项目中使用了很多线程的操作,在这做个记录。

实现方法

线程的操作,是java中最重要的部分之一,实现线程操作也有很多种方法,这里仅介绍几种常用的。在springboot框架中,可以使用注解简单实现线程的操作,还有AsyncManager的方式,如果需要复杂的线程操作,可以使用线程池实现。下面根据具体方法进行介绍。

一、注解@Async

springboot框架的注解,使用时也有一些限制,这个在网上也有很多介绍,@Async注解不能在类本身直接调用,在springboot框架中,可以使用单独的Service实现异步方法,然后在其他的类中调用该Service中的异步方法即可,具体如下:

1. 添加注解

在springboot的config中添加 @EnableAsync注解,开启异步线程功能

package com.thcb.boot.config;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;/** * MyConfig * * @author thcb */@Configuration@EnableAsyncpublic class MyConfig { // 自己配置的Config} 2. 创建异步方法Service和实现类

使用service实现耗时的方法 Service类:

package com.thcb.execute.service;import org.springframework.scheduling.annotation.Async;/** * IExecuteService * * @author thcb */public interface IExecuteService { /** * 一些耗时的操作,使用单独线程处理 * 这里就简单写了一个sleep5秒的操作 */ @Async public void sleepingTest();}

Service实现类:

package com.thcb.execute.service.impl;import com.thcb.execute.service.IExecuteService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;/** * ExecuteService业务层处理 * * @author thcb */@Servicepublic class ExecuteServiceImpl implements IExecuteService { private static final Logger log = LoggerFactory.getLogger(ExecuteServiceImpl.class); @Override public void sleepingTest() { log.info("SleepingTest start"); try { Thread.sleep(5000); } catch (Exception e) { log.error("SleepingTest:" + e.toString()); } log.info("SleepingTest end"); }} 3. 调用异步方法

这里根据Springboot的框架,在controller层调用,并使用log查看是否时异步结果。 controller:

package com.thcb.boot.controller;import com.thcb.execute.service.IExecuteService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * TestController * * @author thcb */@RestControllerpublic class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); @Autowired private IExecuteService executeService; @RequestMapping("/test") public String test() { return "spring boot"; } @RequestMapping("/executeTask") public String executeTask() { log.info("executeTask Start!"); executeService.sleepingTest(); log.info("executeTask End!"); return "executeTask"; }}

在log查看结果:

接口直接返回了executeTask,并log出executeTask End!在5秒之后,log打出SleepingTest end,说明使用了异步线程处理了executeService.sleepingTest的方法。

二、AsyncManager

使用AsyncManager方法,也是SpringBoot框架中带的任务管理器,可以实现异步线程。

1. 创建AsyncManager类

使用AsyncManager首先需要创建一个AsyncManager类,这个在springboot框架中应该也是有的:

/** * 异步任务管理器 * * @author thcb */public class AsyncManager { /** * 操作延迟10毫秒 */ private final int OPERATE_DELAY_TIME = 10; /** * 异步操作任务调度线程池 */ private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); /** * 单例模式 */ private AsyncManager() { } private static AsyncManager me = new AsyncManager(); public static AsyncManager me() { return me; } /** * 执行任务 * * @param task 任务 */ public void execute(TimerTask task) { executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); } /** * 停止任务线程池 */ public void shutdown() { Threads.shutdownAndAwaitTermination(executor); }} 2. 创建一个耗时的操作类

这里同样需要创建一个耗时的操作,也是用sleep模拟:

public TimerTask sleepingTest() { return new TimerTask() { @Override public void run() { // 耗时操作 try { Thread.sleep(5000); } catch (Exception e) { log.error("SleepingTest:" + e.toString()); } } }; } 3. 执行异步操作

使用AsyncManager执行异步操作也比较简单,直接调用即可:

// 异步线程池 AsyncManager.me().execute(sleepingTest()); 三、线程池

使用线程池可以设定

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。