Im no Java developer (I come from the NodeJS world) but I use a lot of messaging queuing. This pattern is used to delegate tasks to other services, while yours keeps responsive as much as possible.
Let's say we are building an API that allows signed in users to upload a picture and add some fancy filters to it (like black and white and other instagram like things), also see other users and their albums as well.
Well, image processing can take some heavy processing and if we leave it for the main thread (or main API) to handle this you will only be able to process one image at the time. Not only that, no users will be able to signup or see other's albums because the API is busy applying some fancy filter to a picture using its main thread.
How to solve this? a message queue. A user wants to apply a filter to a picture, the API issues a B&WFilterTask for that picture and places it on a queue.
In the mean time, the user can get some kind of loading message telling him that the image is being processed. At this point your API is not busy because it trusts the task to something or someone else (a worker) who will handle it so it can allow more users to signup, get pictures from albums etc, you get the point.
But... who will handle that task? That could be another service or a worker which tells the API when the task has been completed to notify the user.
How cool is this? it is very cool and convenient! Lets say your site becomes super famous and thousands of users now upload pictures and apply styles to them. The only thing you need to do now is to spawn more workers to grab more tasks from the queue, and kill them (sadly but true) when you dont need them, allowing you to scale and save money.
This same pattern can be applied to the Signup emails you are sending to your users when they create their accounts.
Delegating these tasks allow you to scale your system, keep it responsive and also cost effective as you grow when needed.
We can improve even more... Lets say... NodeJS or Java is not the best for heavy processing so the workers built with it are slow... we could totally rewrite the workers in Python or any other language that is a lot faster for image processing and just let it take tasks from that queue.
Now you have an amazing hybrid service that uses the best-fitted programming languages to do the heavy-lifting and take advantage of them.
Message queues are a big thing...