wie man eine Methode mit mehreren Threads aufruft

Sep 30 2020

Ich habe eine Methode sendMail(list). Diese Methode sendet die E-Mails an die Empfänger, die in der Liste enthalten sind.

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

}

Ich habe diese Art von Methode. Ich möchte diese Methode Thread-basiert ausführen. Wenn ein Thread die E-Mails ausführt, sollte ich dem anderen Thread erlauben sendMail, gleichzeitig auf sie zuzugreifen und sie gleichzeitig zu senden. Jeder individualObjectenthält seine eigene Schlafzeit.

Wie kann ich dafür sorgen, dass es mit den mehreren Threads funktioniert?

Nehmen wir ein Beispiel

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

}

Im obigen Beispiel habe ich eine reguläre Methode, die einzeln ausgeführt wird. Wie kann es gleichzeitig ausgeführt werden

Antworten

1 Gen Sep 30 2020 at 11:39

Wenn Sie die gleichzeitige Ausführung und jedes Mal einen neuen Thread benötigen, finden Sie hier die Lösung

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

Sie müssen Ihre Logik in ein Runnable einfügen und mit new starten Thread(runnable).start(). Um Parameter an jede ausführbare Datei zu übergeben, definieren Sie sie als Klassenvariablen, damit Sie sie über den Konstruktor übergeben und in der runMethode verwenden können:

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