如何使用多个线程调用一个方法

huangapple go评论78阅读模式
英文:

how to call a method with multiple threads

问题

我有一个名为sendMail(list)的方法。此方法将向列表中的收件人发送邮件。

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

我有这样一种方法。我希望基于线程运行此方法,当一个线程正在执行邮件时,我应该允许其他线程访问sendMail并一起同时发送。每个individualObject都包含其自己的睡眠时间。

如何使用多个线程使其工作?

让我们来看一个示例:

import java.util.concurrent.TimeUnit;

public class SleepClass {
    public static void main(String[] args) {
        SleepClass s = new SleepClass();
        new Thread(() -> s.m1(10000)).start();
        new Thread(() -> s.m1(20000)).start();
    }

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

在上面的示例中,我有一个常规方法,它一个接一个地执行。如何使其同时执行,请参阅此链接

英文:

I have a method sendMail(list). This method will send the mails to the recipients which are there in the list.

public void sendMail(List&lt;DTO&gt; 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();
			}
	}

}

I have this kind of method. I want to run this method Thread based, when one thread is executing the mails, I should allow the other thread to access sendMail and send simultaneously together. Each and every individualObject contains it's own sleep time.

How can I make it worked with the multiple threads.

Let's take an example

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&lt; 3; i++) {
			System.out.println(i);
			try {
				Thread.sleep(time);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

}

In the above example I have a regular method and it is executing one by one. How can make it simultaneous execution

答案1

得分: 1

你需要将你的逻辑放入一个Runnable中,并使用new Thread(runnable).start()来启动它。要将参数传递给每个runnable,请将它们定义为类变量,以便您可以通过构造函数传递它们,并在run方法中使用它们:

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

You have to put your logic in a Runnable and launch it using new Thread(runnable).start().
To pass parameters to each runnable define them as class variables so you can pass them via the constructor and use them in the run method:

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

答案2

得分: 1

如果您需要同时执行并且每次都需要一个新线程您可以在这里找到解决方案

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

if you need simultaneous execution and each time new thread you can find the solution here

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(() -&gt; {
			s.m1(time);
	    }).start();
	}
	
	public void m1(int time) {
		
		for(int i = 0; i&lt;= 10; i++) {
			System.out.println(i);
			try {
				Thread.sleep(time);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

}

huangapple
  • 本文由 发表于 2020年9月30日 17:39:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/64134839.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定