关于@Async注释的一个简单问题。
例如:一个方法是@Async注释,它包含thread.sleep几秒钟。 在睡眠之后,他们是一个outStream.println。然后是什么结果。
我使用ThreadPoolTaskExecutor作为执行者
我只是想知道,因为我已经尝试过5秒钟的睡眠,但是在几分之一的时间内获得outStream.println。所以我只是想了解这是否是Async注释的工作原理,即,如果它已经给出了即时响应并且thread.sleep是由其他线程执行的。
答案 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
忙于处理两个第一次调用。