I had the same task:
I used the BlockingQueue of the java.util.concurrent package. I created X worker threads which reads one action from the queue, processes it, and when ready take the next. This is simple, and it works fine.
If you use X = 10 Worker threads, then your task is solved.