因为邮箱发送好慢,一般要好几秒才能发一封QQ邮箱,我就写了一个邮件的队列,用一个线程去发邮件,下面是一个模拟的案例。
该案例模拟一个邮件发送过程。EmailQueueSendUtils包含一个邮件队列,由该EmailQueueSendUtils启动后,将会自动检测是否邮箱队列里面有邮件,如果有,就会发送,否则就会等待新邮件来notify阻塞线程。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Test2{
public static void main(String[] args) throws InterruptedException {
EmailQueueSendUtils emailQueueSendUtils = new EmailQueueSendUtils(new ArrayList<>());
new Thread(emailQueueSendUtils, "1").start();
new Thread(emailQueueSendUtils, "2").start();
for (int i = 0; i < 50; i++) {
emailQueueSendUtils.addEmailTask(i);
}
TimeUnit.SECONDS.sleep(10);
System.exit(0);
}
}
class EmailQueueSendUtils implements Runnable{
private final List<Integer> emailEntityList;
public EmailQueueSendUtils(List<Integer> emailEntityList){
this.emailEntityList = emailEntityList;
}
@Override
public void run() {
while (true){
System.out.println("进入线程"+Thread.currentThread().getName());
synchronized (emailEntityList){
//是否有邮件
if(emailEntityList.size()>0){
while(emailEntityList.size()>0) {
Integer emailEntity = emailEntityList.remove(0);
System.out.println(Thread.currentThread().getName() + ", " + emailEntity + ", size: " + emailEntityList.size());
}
//输出完,等待
try {
emailEntityList.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
try {
emailEntityList.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public void addEmailTask(Integer emailEntity){
synchronized (emailEntityList) {
System.out.println("NUM: "+emailEntity+", 线程:"+Thread.currentThread().getName());
emailEntityList.add(emailEntity);
emailEntityList.notify();
}
}
}