Java 线程池 发送邮件
来源:互联网 发布:网络审查的优缺点 编辑:程序博客网 时间:2024/05/22 05:35
想了解下Java线程池的用法,恰好最近要做一个简易的邮件通知中间功能,所以写下这个笔记。见笑。
servlet代码SendEmailServlet.java:
package servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 发送邮件servlet * @author gandalf * */public class SendEmailServlet extends HttpServlet{private static final int corePoolSize = 1; // 线程池中所保存的核心线程数。private static final int maximumPoolSize = 4; //线程池允许创建的最大线程数。private static final long keepAliveTime = 0; //当前线程池线程总数大于核心线程数时,终止多余的空闲线程的时间。//邮件队列(线程共享)private static BlockingQueue<Runnable> emailQueue = new LinkedBlockingDeque<Runnable>();//实例化线程池(线程共享)private static ThreadPoolExecutor threadPool= new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, emailQueue,new ThreadPoolExecutor.AbortPolicy());@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//要发送的内容String content = req.getParameter("msg");//打印当前活动线程和队列大小System.out.println("--当前线程池大小【"+ threadPool.getPoolSize() + "】,当前队列大小【"+emailQueue.size()+"】");//加入队列threadPool.execute(new SendThread(content));//返回结果PrintWriter out = resp.getWriter();out.println("over");}@Overridepublic void destroy() {//关闭线程池threadPool.shutdown();super.destroy();}}
package servlet;/** * 发送邮件线程 * @author gandalf * */public class SendThread implements Runnable{private String content;public SendThread (String content){this.content = content;}@Overridepublic void run() {try {//发送邮件。。。。Thread.sleep(1000);System.out.println("sendMail:"+content);} catch (InterruptedException e) {e.printStackTrace();}}}
web.xml配置:
<servlet> <servlet-name>sendMsg</servlet-name> <servlet-class>servlet.SendEmailServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>sendMsg</servlet-name> <url-pattern>/sendMsg.do</url-pattern> </servlet-mapping>
测试类,通过GET方式,向127.0.0.1/projectName/sendMsg.do发送请求:
package test;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class ThreadPoolTest1 {public static void main(String[] args) {for(int i=0; i< 20; i++){new MyThread(i+"-t1").run();new MyThread(i+"-t2").run();new MyThread(i+"-t3").run();new MyThread(i+"-t4").run();}}}class MyThread implements Runnable{private String name;public MyThread(String name){this.name = name;}@Overridepublic void run() {try {Thread.sleep(500);System.out.println(name+"-----");URL getUrl = new URL("http://127.0.0.1/ThreadPool/sendMsg.do?msg=sendemailNO:"+name); HttpURLConnection connection = (HttpURLConnection) getUrl .openConnection(); // 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到服务器 connection.connect(); // 取得输入流,并使用Reader读取 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码 String lines; while ((lines = reader.readLine()) != null){ System.out.println(lines); } reader.close(); // 断开连接 connection.disconnect();} catch (Exception e) {e.printStackTrace();}}}
测试结果:
--当前线程池大小【0】,当前队列大小【0】--当前线程池大小【1】,当前队列大小【0】sendMail:sendemailNO:0-t1--当前线程池大小【1】,当前队列大小【0】--当前线程池大小【1】,当前队列大小【1】sendMail:sendemailNO:0-t2--当前线程池大小【1】,当前队列大小【1】--当前线程池大小【1】,当前队列大小【2】sendMail:sendemailNO:0-t3--当前线程池大小【1】,当前队列大小【2】--当前线程池大小【1】,当前队列大小【3】sendMail:sendemailNO:0-t4--当前线程池大小【1】,当前队列大小【3】--当前线程池大小【1】,当前队列大小【4】sendMail:sendemailNO:1-t1--当前线程池大小【1】,当前队列大小【4】--当前线程池大小【1】,当前队列大小【5】sendMail:sendemailNO:1-t2--当前线程池大小【1】,当前队列大小【5】--当前线程池大小【1】,当前队列大小【6】sendMail:sendemailNO:1-t3--当前线程池大小【1】,当前队列大小【6】--当前线程池大小【1】,当前队列大小【7】sendMail:sendemailNO:1-t4--当前线程池大小【1】,当前队列大小【7】--当前线程池大小【1】,当前队列大小【8】sendMail:sendemailNO:2-t1sendMail:sendemailNO:2-t2sendMail:sendemailNO:2-t3
0 0
- Java 线程池 发送邮件
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介,线程邮件发送实例
- 利用线程发送邮件
- 线程发送邮件
- [java]Java发送邮件
- 改用线程发送邮件,出错?
- java 邮件发送 --- 简单的邮件发送
- JAVA发送邮件及springboot发送邮件
- 用java发送邮件
- 用Java发送邮件
- java发送邮件源码
- java发送邮件
- Java发送邮件
- Java发送邮件程序
- java发送Email邮件
- 怎样用java发送邮件
- 利用java发送邮件
- java 邮件发送
- android gallery2 源码分析
- 生活中的小窍门
- android
- linux do_fork()源代码分析
- 连接池原理图.doc
- Java 线程池 发送邮件
- 【解决Android2.2开发时 在eclipse 中 file explorer视图不显示sdcard】
- android ui流畅度提示
- 超级块 i节点 数据块 目录块 间接块
- 事件处理机制的初步学习
- 电梯里引发的运营思考
- TextView 加链接所有方法
- 解决打开 layout下布局文件时eclipse死掉原因
- EmptyWorkingSet和内存整理