@Async与outstream和thread.sleep方法

时间:2014-03-18 12:52:04

标签: java spring spring-annotations

关于@Async注释的一个简单问题。

例如:一个方法是@Async注释,它包含thread.sleep几秒钟。 在睡眠之后,他们是一个outStream.println。然后是什么结果。

我使用ThreadPoolTask​​Executor作为执行者

我只是想知道,因为我已经尝试过5秒钟的睡眠,但是在几分之一的时间内获得outStream.println。所以我只是想了解这是否是Async注释的工作原理,即,如果它已经给出了即时响应并且thread.sleep是由其他线程执行的。

1 个答案:

答案 0 :(得分:1)

假设你的方法是这样的

@Async
public void foo() {
    sleep(5000L);
    System.out.println("hello world");
}

这不会告诉你任何事情,因为无论如何5sec等待在另一个线程中。但是如果你有这样的东西

public void bar() {
    myService.foo();
    System.out.println("hello world");
}

然后,如果你在“几分之一秒内”获得Hello World,则意味着foo的调用确实是异步完成的。

当您使用@Async调用方法时,方法调用将包装在Callable中,并使用submit方法将该实例传递给executor服务。

如果执行者无法处理方法执行,您将获得TaskRejectedException。例如,如果您的ThreadPoolTaskExecutor的池大小为2个线程且队列大小为0,那么如果池线程仍然存在,则foo方法的第三次调用将失败并显示TaskRejectedException忙于处理两个第一次调用。