【多线程】发一个自己写的wait(),notify小案例

因为邮箱发送好慢,一般要好几秒才能发一封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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值