Vi que o instrutor Alex publicou um artigo ensinando como usar as Coroutines no lugar da Asynctask, porém eu como sou usuário do Java, gostaria de saber como posso usar o java.util.concurrent para desempenhar o mesmo papel da asynctask, inclusive, enviando respostas para a thread principal, como no exemplo abaixo:
public class JogadorJaExisteTask extends AsyncTask<Void, Void, Boolean> {
    private final JogadorDao jogadorDao;
    private final Fut fut;
    private final String textNome;
    private final Jogador jogador;
    private final JogadorJaExisteListener listener;
    public JogadorJaExisteTask(JogadorDao jogadorDao,
                               Fut fut,
                               String textNome,
                               Jogador jogador,
                               JogadorJaExisteListener listener) {
        this.jogadorDao = jogadorDao;
        this.fut = fut;
        this.textNome = textNome;
        this.jogador = jogador;
        this.listener = listener;
    }
    @Override
    protected Boolean doInBackground(Void... voids) {
        for (Jogador j: jogadorDao.getJogadoresFut((int) fut.getFutId())) {
            if (j.getNome().equals(textNome) && !j.getNome().equals(jogador.getNome())) {
                return true;
            }
        }
        return false;
    }
    @Override
    protected void onPostExecute(Boolean jogadorJaExiste) {
        super.onPostExecute(jogadorJaExiste);
        listener.aposVerificar(jogadorJaExiste);
    }
    public interface JogadorJaExisteListener {
        void aposVerificar(Boolean jogadorJaExiste);
    }
} 
            