como chamar um método com vários threads
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
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();
}
}
}
}
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();
}
}
}
}