como chamar um método com vários threads

Sep 30 2020

Eu tenho um método sendMail(list). Este método irá enviar os emails aos destinatários que constam da lista.

public void sendMail(List<DTO> dto) {


        for(DTO individualObject: dto) {
            
            bulkMailSender.sendSimpleMessage(individualObject.getEmail(),masterDetails.getMailSubject() , content, masterDetails.getMailFrom(), individualObject); 
            try {
                TimeUnit.MINUTES.sleep(Long.parseLong(individualObject.getTimegap().trim()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }

}

Eu tenho esse tipo de método. Quero executar este método baseado em thread, quando um thread está executando os e-mails, devo permitir que o outro thread acesse sendMaile envie simultaneamente. Cada um individualObjectcontém seu próprio tempo de sono.

Como posso fazer isso funcionar com os vários threads.

Vamos dar um exemplo

import java.util.concurrent.TimeUnit;

public class SleepClass {
    public static void main(String[] args) {
        SleepClass s= new SleepClass();
        s.m1(10000);
        s.m1(20000);
        
        
    }
    
    public void m1(int time) {
        
        for(int i = 0; i< 3; i++) {
            System.out.println(i);
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
    }

}

No exemplo acima, tenho um método regular e ele está sendo executado um por um. Como posso fazer com que seja execução simultânea

Respostas

1 Gen Sep 30 2020 at 11:39

se você precisa de execução simultânea e cada vez que um novo thread você pode encontrar a solução aqui

public class SleepClass {
    public static void main(String[] args) {
        SleepClass s= new SleepClass();
        s.m2(500);
        s.m2(1000);
    }
    
    public void m2(int time) {
        SleepClass s= new SleepClass();
        new Thread(() -> {
            s.m1(time);
        }).start();
    }
    
    public void m1(int time) {
        
        for(int i = 0; i<= 10; i++) {
            System.out.println(i);
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
    }

}
1 Conffusion Sep 30 2020 at 10:28

Você tem que colocar sua lógica em um Runnable e iniciá-lo usando novo Thread(runnable).start(). Para passar parâmetros para cada executável, defina-os como variáveis ​​de classe para que você possa passá-los por meio do construtor e usá-los no runmétodo:

public class SleepClass {

    public static void main(String[] args) {
        SleepClass s= new SleepClass();
        s.m1(10000);
        s.m1(20000);
    }
    
    public void m1(int time) {
        for(int i = 0; i< 3; i++) {
            new Thread(new Launcher(i,time)).start();
        }
    }

    public class Launcher implements Runnable {
        int i;
        int time;
        public Launcher(int i, int time) {
            this.i=i;
            this.time=time;
        }
        @Override
        public void run() {
            System.out.println(i);
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }                   
        }
        
    }
}