comment appeler une méthode avec plusieurs threads

Sep 30 2020

J'ai une méthode sendMail(list). Cette méthode enverra les mails aux destinataires qui sont là dans la liste.

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();
            }
    }

}

J'ai ce genre de méthode. Je veux exécuter cette méthode basée sur les threads, lorsqu'un thread exécute les mails, je dois autoriser l'autre thread à accéder sendMailet à envoyer simultanément. Chacun individualObjectcontient son propre temps de sommeil.

Comment puis-je le faire fonctionner avec les multiples threads.

Prenons un exemple

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();
            }
        }
        
    }

}

Dans l'exemple ci-dessus, j'ai une méthode régulière et elle s'exécute une par une. Comment en faire une exécution simultanée

Réponses

1 Gen Sep 30 2020 at 11:39

si vous avez besoin d'une exécution simultanée et à chaque fois qu'un nouveau thread vous pouvez trouver la solution ici

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

Vous devez mettre votre logique dans un Runnable et le lancer en utilisant new Thread(runnable).start(). Pour passer des paramètres à chaque exécutable, définissez-les comme des variables de classe afin de pouvoir les passer via le constructeur et les utiliser dans la runméthode:

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();
            }                   
        }
        
    }
}