One way of doing it, is to think in a different way about the threads. Threads are a way of executing methods. So why no execute a method on some applicationservice, just like your controllers do.
Code:
class FireServiceImpl implements FireService{
void fire(long id){
Employee e = employeeRepository.load(id);
e.fire();
}
}
You can wrap a transaction around this service.
And you can call this service from a runnable:
Code:
class FireRunnable implements Runnable{
FireService service;
long id;
public void run(){
service.fire(id);
}
}