Vladislav
Не обязательно делать Listener и отдельный поток, главное чтобы логика расчета и выплаты была в разных классах, иначе нарушается Single Responsibility
Ну если сделать в run:
matchService.generateResult(Match match);
betService.payBets(Match match);
То получается, что сам поток выполняет разную логику и нарушает SRP, или с потоками это не так работает?