java异步调用方法有哪些?如何实现异步调用?

KLQ 2020-06-17 10:02:21 java常见问答 7981

你知道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架构师栏目进行了解吧。

推荐阅读:

java异步的实现方式有哪些?java异步怎么实现?

java并发包下的类一般都有哪些?java并发包常用类

java框架有哪些?都有什么用处?