你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧!
1、利用Spring的异步方法去执行
注:没有返回值
在启动类又或者是配置类加上@EnableAsync注解。
package me.deweixu.aysncdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @SpringBootApplication public class AysncDemoApplication { public static void main(String[] args) { SpringApplication.run(AysncDemoApplication.class, args); } }
先将longTimeMethod封装到Spring的异步方法当中。
这样的方法必须要写在Spring管理的类当中。
还要注意注解@Async。
@Async注解能够在方法上使用,也能够在类上,用在类上,对类当中的所有方法起作用。
@Servicepublic class AsynchronousService{ @Async public void springAsynchronousMethod(){ longTimeMethod(); } }
其他类调用该方法。
注意了,一定要其他的类,假如,在同类中调用,那么是不会生效的。
至于为什么会这样,大家对Spring AOP的实现原理进行一下了解。
@Autowired private AsynchronousService asynchronousService; public void useAsynchronousMethod() { //我们需要执行的代码1 asynchronousService.springAsynchronousMethod(); //我们需要执行的代码2 }
二、原生Future方法
//我们需要执行的代码1 Future future = longTimeMethod2(); //我们需要执行的代码2 Integer result = future.get();
调用longTimeMethod2返回一个Future对象,之后处理需要执行的代码2,到需要返回结果时,直接调用future.get(),就可以获取到返回值。
再一起来看看如何实现longTimeMethod2。
private Future longTimeMethod2() { //创建线程池 ExecutorService threadPool = Executors.newCachedThreadPool(); //获取异步Future对象 Future future = threadPool.submit(new Callable() { @Override public Integer call() throwsException { return longTimeMethod(); } }); return future; }
三、多线程
new线程
Thread t = new Thread() { @Override public void run() { longTimeMethod(); } };
private ExecutorService executor = Executors.newCachedThreadPool(); public void fun() throws Exception { executor.submit(new Runnable() { @override public void run() { try { //要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试 Thread.sleep(10000); System.out.print("睡够啦~"); } catch (Exception e) { throw new RuntimeException("报错啦!!"); } } }); }
四、Spring的异步方法和Future接收返回值
将longTimeMethod封装到Spring的异步方法当中。
这里的异步方法的返回值是Future的实例。
这个方法必须要写在Spring管理的类当中。
注意注解@Async。
@Service public class AsynchronousService { @Async public Future springAsynchronousMethod() { Integer result = longTimeMethod(); return new AsyncResult(result); } }
其他类调用这个方法。
这里要注意一下,一定要其他的类,假如在同类当中的话,是不可以生效的。
假如,调用之后接收返回值,不对返回值进行操作则为异步操作,进行操作就转为同步操作,等待对返回值操作完之后,才会继续执行主进程下面的流程。
@Autowired private AsynchronousService asynchronousService; public void useAsynchronousMethod() { Future future = asynchronousService.springAsynchronousMethod(); future.get(1000, TimeUnit.MILLISECONDS); }
java异步调用方法你都了解了吧,更多相关内容,请继续来奇Q工具网的java架构师栏目进行了解吧。
推荐阅读: