热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

独立线程发送邮件

线程基础知识复习通过Callable和FutureTask创建线程,步骤如下:创建Callable接口的实现类,并实现Call方法&#

线程基础知识复习

通过Callable和FutureTask创建线程,步骤如下:


  1. 创建Callable接口的实现类,并实现Call方法;
  2. 创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值;
  3. 使用FutureTask对象作为Thread对象的target创建并启动线程;
  4. 调用FutureTask对象的get()方法来获取子线程执行结束的返回值。

public class Demo{public static void main(String[] args){Callable call &#61; new MyCallable();FutureTask<Object> task &#61; new FutureTask<Object>(call);Thread t &#61; new Thread(task);t.start();try {System.out.println(task.get());//可以作为Future类型对象得到线程运算返回值} catch (Exception e) {e.printStackTrace();}}}class MyCallable implements Callable<Object>{&#64;Overridepublic Object call() throws Exception{System.out.println(Thread.currentThread().getName());return null;}}

通过线程池创建线程&#xff0c;如下&#xff1a;

public class ThreadDemo{public static void main(String[] args){FutureTask<Integer> futureTask &#61; new FutureTask<Integer>(new CallbleThread());ExecutorService executor &#61; Executors.newCachedThreadPool();executor.submit(futureTask);//也可以使用execute&#xff0c;证明其是一个Runnable类型对象executor.shutdown();while(!futureTask.isDone()){System.out.println("子线程还没做完&#xff0c;我再睡会");TimeUnit.SECONDS.sleep(1);}try {System.out.println("子线程运行的结果&#xff1a;"&#43;futureTask.get());} catch (Exception e) {e.printStackTrace();}}
}
class CallbleThread implements Callable<Integer>{&#64;Overridepublic Integer call() throws Exception{System.out.println("线程池创建的线程&#xff1a;"&#43;Thread.currentThread().getName());TimeUnit.SECONDS.sleep(2);return 2;}
}

发送邮件

在独立线程中发送邮件&#xff1a;

public class SendMailUtil{private final Logger logger &#61; Logger.getLogger(this.class);public Boolean sendMailWithTask(Mailbox mailbox){ExecutorService exec &#61; executors.newCachedThreadPool();MailTask task &#61; new MailTask();task.mailbox &#61; mailbox;String failReason &#61; null;Future<Boolean> future &#61; exec.submit(task);Boolean taskResult &#61; false;try{taskResult &#61; future.get(120,TimeUnit.SECONDS);//等待计算结果&#xff0c;最长等待120s&#xff0c;120s后终止任务taskResult &#61; true;}catch(InterruptedException e){failReason &#61; "主线程在等待计算结果时被中断&#xff01;" &#43; e.getMessage();}catch(ExecutionException e){failReason &#61; "主线程等待计算结果&#xff0c;但计算抛出异常&#xff01;" &#43; e.getMessage();}catch(TimeoutException e){failReason &#61; "主线程等待计算结果超时&#xff0c;因此中断任务线程&#xff01;" &#43; e.getMessage();}finally{if(failReason!&#61;null){logger.info(failReason);}}return taskResult ;}class MailTask implements Callable<Boolean>{public Mailbox mailbox &#61; null;public Boolean call() throws Exception{result &#61; MailSender.send(mailbox);return result;}}
}

MailSender类

public class MailSender{public static boolean send(Mailbox mailbox) throws Exception {// 判断是否需要身份认证MyAuthenticator authenticator &#61; null;Properties pro &#61; mailbox.getProperties();// 如果需要身份认证&#xff0c;则创建一个密码验证器if (mailbox.getValidate()) {String password &#61; mailbox.getPassword();authenticator &#61; new MyAuthenticator(mailbox.getEmail(),password );}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession sendMailSession &#61; Session.getInstance(pro, authenticator);// 根据session创建一个邮件消息Message mailMessage &#61; new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from &#61; new InternetAddress(mailbox.getEmail());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址&#xff0c;并设置到邮件消息中Address to &#61; new InternetAddress(mailbox.getToAddress());// Message.RecipientType.TO属性表示接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO, to);//抄送//mailMessage.setRecipient(Message.RecipientType.CC, new InternetAddress(mailbox.getEmail()));// 设置邮件消息的主题mailMessage.setSubject(mailbox.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());//MiniMultipart类是一个容器类&#xff0c;包含MimeBodyPart类型的对象Multipart mainPart1 &#61; new MimeMultipart();BodyPart html &#61; new MimeBodyPart();//创建一个包含HTML内容的MimeBodyParthtml.setContent("hehehe","text/html; charset&#61;utf-8");//设置HTML内容mainPart1.addBodyPart(html);//将MiniMultipart对象设置为邮件内容mailMessage.setContent(mainPart1);// 发送邮件Transport.send(mailMessage);return true;}
}

MailBox类&#xff1a;

public class Mailbox {private Integer mailboxId;private String email;private String password;private String protocol;//imap/imaps/pop3/pop3s 邮箱协议 --SMTP管‘发’&#xff0c;POP3/IMAP管‘收’private String mailServerHost;// 箱服务器的IP(或主机地址)private String mailServerPort;// 服务器的端口private String passwordEncrypt;// 登陆邮件服务器的密码private Boolean validate;// 是否需要身份验证private String toAddress;private String subject;private String connectType;//针对邮箱协议连接类型&#64;JsonIgnorepublic Properties getProperties() {Properties p &#61; new Properties();p.put("mail."&#43;this.protocol&#43;".host", this.mailServerHost);p.put("mail."&#43;this.protocol&#43;".port", this.mailServerPort);p.put("mail."&#43;this.protocol&#43;".auth", validate);if("TLS".equals(this.connectType)){p.put("mail."&#43;this.protocol&#43;".starttls.enable", true);}else if("SSL".equals(this.connectType)){p.put("mail."&#43;this.protocol&#43;".ssl.enable", true);}return p;}//属性的getter和setter方法略
}

推荐阅读
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
author-avatar
月雨淅淅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有