@Async lets your program do tasks in the background without waiting. This helps your app stay fast and responsive.
@Async for async methods in Spring Boot
@Async
public CompletableFuture<Type> methodName() {
// method body
}Use @Async above a method to run it in a new thread.
The method should return CompletableFuture or void.
@Async
public void sendEmail() {
// send email code
}@Async
public CompletableFuture<String> fetchData() {
// fetch data code
return CompletableFuture.completedFuture("data");
}This example shows a service with an async method that waits 1 second then returns a message. The main runner calls it without blocking, then waits for the result to print.
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Service; import org.springframework.context.annotation.Configuration; import java.util.concurrent.CompletableFuture; @Configuration @EnableAsync public class AsyncConfig { } @Service public class AsyncService { @Async public CompletableFuture<String> asyncTask() { try { Thread.sleep(1000); // simulate delay } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return CompletableFuture.completedFuture("Task Completed"); } } // Usage in another component import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.util.concurrent.CompletableFuture; @Component public class AppRunner implements CommandLineRunner { @Autowired private AsyncService asyncService; @Override public void run(String... args) throws Exception { System.out.println("Starting async call"); CompletableFuture<String> future = asyncService.asyncTask(); System.out.println("Async call made"); System.out.println("Result: " + future.get()); } }
Remember to add @EnableAsync in your configuration to activate async support.
Async methods must be public and called from outside their own class to work properly.
@Async runs methods in the background to keep your app responsive.
Use it for tasks that take time but don't need to block the user.
Make sure to enable async support with @EnableAsync.
Practice
What is the main purpose of using @Async in a Spring Boot application?
Solution
Step 1: Understand what
@Asyncdoes@Asyncallows methods to run in a separate thread, so they don't block the main thread.Step 2: Identify the main benefit
This helps keep the app responsive by running long tasks in the background.Final Answer:
To run methods in the background without blocking the main thread -> Option DQuick Check:
Background execution = To run methods in the background without blocking the main thread [OK]
- Thinking @Async speeds up method execution
- Confusing @Async with security annotations
- Assuming @Async retries failed methods automatically
Which annotation must be added to a Spring Boot configuration class to enable @Async support?
Solution
Step 1: Recall the enabling annotation for async
Spring Boot requires@EnableAsyncon a configuration class to activate async processing.Step 2: Confirm the exact annotation name
The correct annotation is@EnableAsync, not any other variant.Final Answer:
@EnableAsync -> Option AQuick Check:
Enable async = @EnableAsync [OK]
- Using @EnableScheduling instead of @EnableAsync
- Guessing annotation names without checking docs
- Confusing @Async with enabling annotations
Consider this Spring Boot method annotated with @Async:
@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Done");
}What will be the output if you call fetchData().get()?
Solution
Step 1: Understand CompletableFuture with @Async
The method returns a CompletableFuture that completes immediately with "Done".Step 2: Calling get() on CompletableFuture
Callingget()blocks the caller until the async task finishes and then returns the result.Final Answer:
It blocks until the async task completes and returns "Done" -> Option AQuick Check:
CompletableFuture.get() blocks and returns result [OK]
- Assuming async methods return immediately without blocking on get()
- Thinking async methods can't return values
- Confusing exceptions with null returns
Given this Spring Boot service method:
@Async
public void process() {
System.out.println("Start");
throw new RuntimeException("Error");
}What happens when process() is called?
Solution
Step 1: Understand exception handling in @Async methods
Exceptions in async methods run in a separate thread and do not propagate to the caller.Step 2: What happens to the exception?
The exception is logged by Spring but does not crash or throw on the caller thread.Final Answer:
The exception is logged but does not affect the caller thread -> Option BQuick Check:
Async exceptions logged, caller unaffected [OK]
- Expecting exceptions to propagate to caller immediately
- Thinking async methods run synchronously
- Assuming exceptions are ignored silently
You want to run two independent tasks asynchronously and wait concurrently for both to finish before proceeding. Which approach using @Async and CompletableFuture is correct?
@Async
public CompletableFuture<String> taskOne() { ... }
@Async
public CompletableFuture<String> taskTwo() { ... }
public void runTasks() throws Exception {
CompletableFuture<String> future1 = taskOne();
CompletableFuture<String> future2 = taskTwo();
// What to do here?
}Solution
Step 1: Understand waiting for multiple async tasks
Callingget()sequentially works but is inefficient and blocks one after another.Step 2: Use CompletableFuture.allOf for parallel waiting
CompletableFuture.allOf(future1, future2).join()waits for both tasks to complete concurrently.Final Answer:
Use CompletableFuture.allOf(future1, future2).join() to wait both -> Option CQuick Check:
Wait all async tasks with allOf().join() [OK]
- Calling get() sequentially causing unnecessary blocking
- Not waiting at all and proceeding too early
- Trying to manually complete futures which is incorrect
Ready to prove it?
Pass the test and this pattern moves unknown
