热门标签 | 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方法略
}

推荐阅读
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 出库管理 | 零件设计中的状态模式学习心得与应用分析
    出库管理 | 零件设计中的状态模式学习心得与应用分析 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
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社区 版权所有