一、java mail的两个JAR包

1、mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5;

下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html

2、activation.jar:JavaMail依赖JAF(JavaBeans Activation Framework),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。

最好单独下载加入到工程中。

下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html

二、常用API介绍

  1. javax.mail.Session:会话类,如服务器的主机名、端口号、协议名称等  主要用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。它表示程序与某一个邮件服务器即将建立通信,在建立的过程可以进行口令认证。
  2. javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等
  3. javax.mail.Transport:邮件发送类 连接邮件SMTP服务器,发送邮件
  4. javax.mail.Store:邮件接收类 连接邮件POP3、IMAP服务器,收取邮件, 邮件服务器中的存储库,里面放着所有的邮件文件夹
  5. javax.mail.internet.InternetAddress 主要是表示邮件发送人和邮件接收人的地址
  6. javax.mail.Folder  该文件夹就是消息的具体所在文件夹,默认的邮件均在INBOX文件中

三、使用java mail 发送邮件

基本步骤:

1 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false

2 利用Session.getInstance(Properties)启动一个与邮件服务器的会话

3 根据获取的Session来传建一个消息Message

4 定义消息的发信人地址InternetAddress和消息的收信人地址。

5 设置消息发送的主题和内容

6 利用Message.saveChanges()来存储填写的邮件信息

7 根据Session.getTransport("smtp")获取邮件发送类

8 利用发送人的用户名和密码连接到指定的邮件服务器

9 将该消息发送

10 关闭连接

eg:

(1)发送一个纯文本邮件

package mail;

import java.util.Date;
import java.util.Properties; import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; /**
* 邮件发送服务
*/
public class SendMailService
{ /**
* 发送纯文本邮件
* @param smtpHost 邮件服务器
* @param to 收件人(可以是多个,使用逗号分隔)
* @param cc 抄送人(可以是多个,使用逗号分隔)
* @param bcc密送人(可以是多个,使用逗号分隔)
* @param sender发件人
* @param title邮件标题
* @param content邮件内容
* @param username邮箱用户名(一般是去掉@之前的那一部分)
* @param password(邮箱密码)
* @throws MessagingException
*/
public static void sendPlainTextEmail(String smtpHost,
String to,
String cc,
String bcc,
String sender,
String title,
String content,
String username,
String password
) throws MessagingException
{
//第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
Properties props = new Properties();
props.put("mail.host", smtpHost);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
Session session = Session.getInstance(props);
session.setDebug(true); //第三步 根据获取的Session来传建一个消息Message
MimeMessage message = new MimeMessage(session); //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
//发件人
InternetAddress sendaddr = new InternetAddress(sender);
message.setFrom(sendaddr);
//收件人
InternetAddress[] toaddrs = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toaddrs);
//抄送人
InternetAddress[] ccaddrs = InternetAddress.parse(cc);
message.setRecipients(Message.RecipientType.CC, ccaddrs);
//密送人
InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
message.setRecipients(Message.RecipientType.BCC, bccaddrs);
//第五步 设置消息发送的主题、内容、时间
message.setSubject(title);
message.setText(content);
message.setSentDate(new Date());
//第六步 利用Message.saveChanges()来存储填写的邮件信息
message.saveChanges();
//第七步 根据Session.getTransport("smtp")获取邮件发送类
Transport ts = session.getTransport("smtp");
//第八步 利用发送人的用户名和密码连接到指定的邮件服务器
ts.connect(smtpHost, username, password);
//第九步将该消息发送
ts.sendMessage(message, message.getAllRecipients());
//第十步 关闭连接
ts.close();
} }

(2)先创建已通过身份验证的会话连接 再发送邮件

package mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication; /**
* 用户身份认证
* @author Administrator
*
*/
public class SmtpAuth extends Authenticator
{ private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public void setUserinfo(String username,String password)
{
this.username = username;
this.password = password;
} protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(username,password);
} }
package mail;

import java.util.Date;
import java.util.Properties; import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; /**
* 邮件发送服务
*/
public class SendMailService
{ /**
* 发送纯文本邮件
* @param smtpHost 邮件服务器
* @param to 收件人(可以是多个,使用逗号分隔)
* @param cc 抄送人(可以是多个,使用逗号分隔)
* @param bcc密送人(可以是多个,使用逗号分隔)
* @param sender发件人
* @param title邮件标题
* @param content邮件内容
* @param username邮箱用户名(一般是去掉@之前的那一部分)
* @param password(邮箱密码)
* @throws MessagingException
*/ public static void sendPlainTextEmailByAuth(String smtpHost,
String to,
String cc,
String bcc,
String sender,
String title,
String content,
String username,
String password
) throws MessagingException
{
//第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
Properties props = new Properties();
props.put("mail.host", smtpHost);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
SmtpAuth sa = new SmtpAuth();
sa.setUserinfo(username, password);
//Session session = Session.getInstance(props, sa);
Session session = Session.getDefaultInstance(props, sa);
session.setPasswordAuthentication(new URLName(smtpHost), sa.getPasswordAuthentication());
session.setDebug(true); //第三步 根据获取的Session来传建一个消息Message
MimeMessage message = new MimeMessage(session); //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
//发件人
InternetAddress sendaddr = new InternetAddress(sender);
message.setFrom(sendaddr);
//收件人
InternetAddress[] toaddrs = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toaddrs);
//抄送人
InternetAddress[] ccaddrs = InternetAddress.parse(cc);
message.setRecipients(Message.RecipientType.CC, ccaddrs);
//密送人
InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
message.setRecipients(Message.RecipientType.BCC, bccaddrs);
//第五步 设置消息发送的主题、内容、时间
message.setSubject(title);
message.setText(content);
message.setSentDate(new Date());
//第六步 利用Message.saveChanges()来存储填写的邮件信息
message.saveChanges();
//第七步将该消息发送
Transport.send(message);
} public static void main(String[] args)
{
try
{
sendPlainTextEmailByAuth("smtp.163.com", "cac2020@163.com", "ssssss@qq.com", "", "cac2020@163.com", "测试一个纯文本邮件", "ssssss", "cac2020", "ffafasdfsdfsaf");
}
catch (MessagingException e)
{
e.printStackTrace();
} } }

(3)发送一封含图片的邮件

package mail;

import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; /**
* 邮件发送服务
*/
public class SendMailService
{ /**
* 发送内嵌图片邮件
* @param smtpHost 邮件服务器
* @param to 收件人(可以是多个,使用逗号分隔)
* @param cc 抄送人(可以是多个,使用逗号分隔)
* @param bcc密送人(可以是多个,使用逗号分隔)
* @param sender发件人
* @param title邮件标题
* @param username邮箱用户名(一般是去掉@之前的那一部分)
* @param password(邮箱密码)
* @throws MessagingException
*/
public static void sendImageEmail(String smtpHost,
String to,
String cc,
String bcc,
String sender,
String title,
String username,
String password) throws MessagingException
{
Properties props = new Properties();
props.put("mail.host", smtpHost);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props);
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect(smtpHost, username, password); //创建含图片邮件
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(sender));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
msg.setSubject(title);
msg.setSentDate(new Date()); //邮件正文文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:576f707a5ba85.JPG'>的邮件", "text/html;charset=UTF-8"); //邮件正文中的图片
MimeBodyPart image = new MimeBodyPart();
image.setContentID("576f707a5ba85.JPG");
DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG"));
image.setDataHandler(dh); MimeMultipart mmp = new MimeMultipart();
mmp.addBodyPart(text);
mmp.addBodyPart(image);
mmp.setSubType("related"); msg.setContent(mmp);
msg.saveChanges(); ts.sendMessage(msg, msg.getAllRecipients());
ts.close();
} }

(4)发送包含附件的图片

package mail;

import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; /**
* 邮件发送服务
*/
public class SendMailService
{ /**
* 发送含附件邮件
* @param smtpHost 邮件服务器
* @param to 收件人(可以是多个,使用逗号分隔)
* @param cc 抄送人(可以是多个,使用逗号分隔)
* @param bcc密送人(可以是多个,使用逗号分隔)
* @param sender发件人
* @param title邮件标题
* @param username邮箱用户名(一般是去掉@之前的那一部分)
* @param password(邮箱密码)
* @throws MessagingException
*/
public static void sendAttachEmail(String smtpHost,
String to,
String cc,
String bcc,
String sender,
String title,
String username,
String password) throws MessagingException
{
Properties props = new Properties();
props.put("mail.host", smtpHost);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props);
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect(smtpHost, username, password); //创建含图片邮件
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(sender));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
msg.setSubject(title);
msg.setSentDate(new Date()); //邮件正文文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8"); //邮件附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG"));
attach.setDataHandler(dh);
attach.setFileName(dh.getName()); //创建个区块之间关系
MimeMultipart mmp = new MimeMultipart();
mmp.addBodyPart(text);
mmp.addBodyPart(attach);
mmp.setSubType("mixed"); msg.setContent(mmp);
msg.saveChanges(); ts.sendMessage(msg, msg.getAllRecipients());
ts.close();
} }

(5)发送包含内嵌图片和附件的复杂邮件

package mail;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility; /**
* 邮件发送服务
*/
public class SendMailService
{ /**
* 发送含附件邮件
* @param smtpHost 邮件服务器
* @param to 收件人(可以是多个,使用逗号分隔)
* @param cc 抄送人(可以是多个,使用逗号分隔)
* @param bcc密送人(可以是多个,使用逗号分隔)
* @param sender发件人
* @param title邮件标题
* @param username邮箱用户名(一般是去掉@之前的那一部分)
* @param password(邮箱密码)
* @throws MessagingException
* @throws IOException
* @throws FileNotFoundException
*/
public static void sendComplexEmail(String smtpHost,
String to,
String cc,
String bcc,
String sender,
String title,
String username,
String password) throws MessagingException, FileNotFoundException, IOException
{
Properties props = new Properties();
props.put("mail.host", smtpHost);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props);
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect(smtpHost, username, password); //创建含图片邮件
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(sender));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
msg.setSubject(title);
msg.setSentDate(new Date()); //邮件正文文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("测试<br/><img src='cid:1.PNG'>","text/html;charset=UTF-8"); //图片
MimeBodyPart image = new MimeBodyPart();
image.setContentID("1.PNG");
image.setDataHandler(new DataHandler(new FileDataSource("src\\1.PNG"))); //附件1
MimeBodyPart attach1 = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\1.rar"));
attach1.setDataHandler(dh);
attach1.setFileName(dh.getName()); //附件2 注意附件名是中文名
MimeBodyPart attach2 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("src\\测试中文附件名.rar"));
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText(dh2.getName())); //描述关系:正文和图片
MimeMultipart mp1 = new MimeMultipart();
mp1.addBodyPart(text);
mp1.addBodyPart(image);
mp1.setSubType("related");
//将正文和图片组合作为一个整体 的正文内容
MimeBodyPart content = new MimeBodyPart();
content.setContent(mp1); //描述关系:正文和附件
MimeMultipart mp2 = new MimeMultipart();
mp2.addBodyPart(attach1);
mp2.addBodyPart(attach2);
mp2.addBodyPart(content);
mp2.setSubType("mixed"); //message设置邮件内容
msg.setContent(mp2);
msg.saveChanges();
msg.writeTo(new FileOutputStream("E:\\MixedMail.eml")); ts.sendMessage(msg, msg.getAllRecipients());
ts.close();
} }

四、使用java mail 接收邮件

基本步骤:

1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用

2 Session.getDefaultInstance()获取一个邮件会话

3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3");获取一个Store

4 存储库向指定的邮件服务器建立连接

5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹

6 打开INBOX文件夹

7 消息处理

8 关闭文件夹

9 关闭存储库

package mail;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties; import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility; public class ReceiveMailService
{ public static void receiveMail(String popHost, String username,String password) throws MessagingException, IOException
{ //1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用
Properties props = new Properties();
//props.put("mail.host", smtpHost);
//props.put("mail.smtp.auth", "true");
//props.put("mail.transport.protocol", "smtp");
//props.put("mail.transport.port", "25");
props.put("mail.store.port", "pop3"); //2 Session.getDefaultInstance()获取一个邮件会话
Session session = Session.getDefaultInstance(props);
//3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3"); 也可以是IMAP 获取一个Store
Store store = session.getStore("pop3");
//4 存储库向指定的邮件服务器建立连接
store.connect(popHost, username, password);
//5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹
Folder folder = store.getFolder("INBOX");
//6 打开INBOX文件夹
folder.open(Folder.READ_ONLY);
//7 消息处理
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++)
{
System.out.println("------------Message--" + (i + 1) + "------------");
// 解析地址为字符串 发件人
String from = InternetAddress.toString(messages[i].getFrom());
if (from != null)
{
String cin = getChineseFrom(from);
System.out.println("From:" + cin);
}
//回复给发件人
String replyTo = InternetAddress.toString(messages[i].getReplyTo());
if (replyTo != null)
{
String rest = getChineseFrom(replyTo);
System.out.println("Reply To:" + rest);
}
//
String to = InternetAddress.toString(messages[i].getRecipients(Message.RecipientType.TO));
if (to != null)
{
String tos = getChineseFrom(to);
System.out.println("To:" + tos);
}
//邮件主题
String subject = messages[i].getSubject();
if (subject != null)
{
System.out.println("Subject:" + subject);
}
//发送日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date sent = messages[i].getSentDate();
if (sent != null)
{
System.out.println("Sent Date:" + sdf.format(sent));
}
//接收日期
Date ress = messages[i].getReceivedDate();
if (ress != null)
{
System.out.println("Receive Date:" + sdf.format(ress));
} // 显示消息的所有首部信息
Enumeration<Header> headers = messages[i].getAllHeaders();
while(headers.hasMoreElements())
{
Header h=(Header)headers.nextElement();
String res=h.getName();
String val=h.getValue();
System.out.println(res+":"+val);
}
System.out.println();
//读取消息主题部分
Object content = messages[i].getContent();
System.out.println(content);
//根据指定的编码格式读出内容
Reader read = new InputStreamReader(messages[i].getInputStream());
int a=0;
while((a=read.read())!=-1)
{
System.out.print((char)a);
}
//获取该消息的类型
String type=messages[i].getContentType();
String sender=InternetAddress.toString(messages[i].getFrom());
System.out.println("Sender:"+sender);
System.out.println("Content-type:"+type);
}
//8 关闭文件夹但不删除服务器上的消息 false代表不是删除
folder.close(false);//当为true时会删掉已经标记为删除的邮件
//9 关闭存储库
store.close();
} // 解决中文乱码问题
public static String getChineseFrom(String res)
{
String from = res;
try
{
if (from.startsWith("=?GB") || from.startsWith("=?gb") || from.startsWith("=?UTF"))
{
from = MimeUtility.decodeText(from);
}
else
{
from = new String(from.getBytes("ISO8859_1"), "GBK");
}
}
catch (Exception e)
{
e.printStackTrace();
} return from;
} public static void main(String[] args)
{
try
{
receiveMail("pop3.163.com", "cac2020", "fadgfjkssdfkasjg");
}
catch (Exception e)
{
e.printStackTrace();
}
} }

参考:

http://blog.csdn.net/ghsau/article/details/17839983

http://www.cnblogs.com/xdp-gacl/p/4216311.html

http://computerdragon.blog.51cto.com/6235984/1197390

http://blog.sina.com.cn/s/blog_67196ddc0101fdrn.html

Java邮件服务学习之三:邮箱服务客户端-Java Mail的更多相关文章

  1. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  2. java版gRPC实战之三:服务端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. 微服务学习一 微服务session 管理

    集群和分布式架构中: session管理有三种方法: 1: Cookie: 将Session对象保存在Cookie,保存在浏览器端.浏览器发送请求的时候,会把整个session放在请求里一起发送到se ...

  4. 【Java语言特性学习之三】Java4种对象引用

    为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使 ...

  5. JAVA并发设计模式学习笔记(一)—— JAVA多线程编程

    这个专题主要讨论并发编程的问题,所有的讨论都是基于JAVA语言的(因其独特的内存模型以及原生对多线程的支持能力),不过本文传达的是一种分析的思路,任何有经验的朋友都能很轻松地将其扩展到任何一门语言. ...

  6. 一位资深程序员给予Java初学者的学习路线建议

    一位资深程序员给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干 ...

  7. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  8. Java线程池学习

    Java线程池学习 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java ...

  9. java多线程入门学习(一)

    java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程.     线程:同一类线程共享代码 ...

随机推荐

  1. jpa懒加载异常

    1.项目背景概述 事情是这样子的,使用了spring data jpa的项目jeesite jeesite的实体中使用了懒加载模式. 并且一个实体类中还不止一个属性设置了懒加载模式. 项目本身已经存在 ...

  2. C#sqlbulkcopy的优化

    最近在进行项目的优化.现在部分数据的拷贝时间过长.需要进行上线前的优化,尝试,批次的数量和拷贝次数的之间的合理数值关系. 最近项目中使用到了SqlBulkCopy实现批量复制,在这里,我把部分代码筛选 ...

  3. 面试题_76_to_81_Java 最佳实践的面试问题

    包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等. 76)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)这是我在写Java 并发程序的 ...

  4. mkdir -p

    git bash 或 mac terminal 我们可以使用 mkdir 命令来创建文件夹. 当前目录创建多个文件夹: $ mkdir a b c 会创建 a .b.c 三个文件夹 但是有时候我们需要 ...

  5. Codeforces Round #207 (Div. 1)B(数学)

    数学so奇妙.. 这题肯定会有一个循环节 就是最小公倍数 对于公倍数内的相同的数的判断 就要借助最大公约数了 想想可以想明白 #include <iostream> #include< ...

  6. 宏HASH_GET_FIRST

    /*******************************************************************//** Gets the first struct in a ...

  7. 函数rec_get_nth_field_offs_old

    /************************************************************//** The following function is used to ...

  8. QSettings读写注册表、配置文件

    简述 一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表.读写配置文件. 关于QSettings的使用前面已经介绍过了,比较详细,见" ...

  9. BZOJ2693: jzptab

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2693 题意:同2154 多组数据 题解:按2154再往后转化一下就可以把n,m放到一边儿,然后 ...

  10. asp.net实现GZip压缩和GZip解压

    最近在开发一个网站doc.115sou.com,使用到了GZip压缩技术,经过多次搜索找到asp.net中用GZip对数据压缩和解压缩非常方便,当我第一次拿到这个类的时候却感觉很迷茫,无从下手.主要是 ...