返回信息流不new子线程了,直接用主线程得了
==================================================================
写了一个注册的Action,功能是接收参数,然后再将数据插入数据库,这个流程没有问题;
然后在Action中new了一个新线程,目的是发送一个激活邮件,程序就卡在new的新线程那里不动了,始终不进去run()方法
百度了一下,说新开的线程代码应该写在service层就可以运行,然后我把新线程的代码放进了service层的方法里,然后在Action中调用service层的那个方法,还是卡那里了,也是不会进入run()方法。
这是一条镜像帖。来源:北邮人论坛 / java / #54369同步于 2016/12/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】[已解决]struts的Action中 new了个新线程就卡着不动了
bupt033
2016/12/19镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 xinzhong 的大作中提到: 】
: 少年,贴代码瞅瞅啊
这里是Action里的代码:
//以上代码省略
....................
//封装参数
User user = new User(null,username,password,phone,address,email);
//生成一个激活码号,用于账户激活
user.setCode(UUID.randomUUID().toString());
//发送邮件,单独启动一个线程
userManager.sendMailThread(user);
.............
//以下代码省略
userManager是一个依赖注入的业务逻辑组件接口,sendMailThread()是组件里边的一个方法,其实现类相关代码如下:
/**
* 发送邮件
* @param user 需要发送激活邮件的用户
* @return null
*/
public void sendMailThread(final User user) throws Exception
{
//System.out.println("here is sendMailThread ");
new Thread(new Runnable() {
public void run() {
System.out.print("here is sendMailThread......");
Properties props=new Properties();
props.setProperty("mail.transport.protocol", "smtp");//规范规定的参数
props.setProperty("mail.host", "smtp.mxhichina.com");//这里使用万网的邮箱主机
props.setProperty("mail.smtp.auth", "true");//请求认证,不认证有可能发不出去邮件。
Session session=Session.getInstance(props); //构造一个发送邮件的session
MimeMessage message=new MimeMessage(session); //跟据session创建一个邮件消息
try {
message.setFrom(new InternetAddress("13321126314@163.com")); //设置邮件消息的发送者
message.setRecipients(Message.RecipientType.TO, user.getEmail()); //设置邮件消息接收者
message.setSubject("注册邮件"); //设置邮件主题
message.setContent("","text/html;charset=UTF-8"); //设置邮件文本内容
message.setContent("亲爱的"+user.getName()+":<br/>请猛戳下面激活您的账户<a href='http://localhost:8888/myprojectweb/activeUser?code="+user.getCode()+"'>激活</a><br/>", "text/html;charset=UTF-8");
message.saveChanges();
System.out.print("here is sendMailThread......prepare sending email");
Transport ts = session.getTransport();
ts.connect("13321126314@163.com", "密码就不写出来啦");//设置登录邮箱的账号,密码
ts.sendMessage(message, message.getAllRecipients());
ts.close();
System.out.print("here is sendMailThread......sending is successfull");
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
【 在 xinzhong 的大作中提到: 】
: 少年,贴代码瞅瞅啊
另一种方法:
自己定义一个工具类,用来发邮件的线程:
public class SendMailThread extends Thread{
private User user;
public SendMailThread(User user){
System.out.print("initail the sendMailThread......");
this.user=user;
}
public void run(){
System.out.print("here is sendMailThread......");
Properties props=new Properties();
props.setProperty("mail.transport.protocol", "smtp");//规范规定的参数
props.setProperty("mail.host", "smtp.mxhichina.com");//这里使用万网的邮箱主机
props.setProperty("mail.smtp.auth", "true");//请求认证,不认证有可能发不出去邮件。
Session session=Session.getInstance(props); //构造一个发送邮件的session
MimeMessage message=new MimeMessage(session); //跟据session创建一个邮件消息
try {
message.setFrom(new InternetAddress("13321126314@163.com")); //设置邮件消息的发送者
message.setRecipients(Message.RecipientType.TO, user.getEmail()); //设置邮件消息接收者
message.setSubject("注册邮件"); //设置邮件主题
message.setContent("","text/html;charset=UTF-8"); //设置邮件文本内容
message.setContent("亲爱的"+user.getName()+":<br/>请猛戳下面激活您的账户<a href='http://localhost:8888/myprojectweb/activeUser?code="+user.getCode()+"'>激活</a><br/>", "text/html;charset=UTF-8");
message.saveChanges();
System.out.print("here is sendMailThread......prepare sending email");
Transport ts = session.getTransport();
ts.connect("13321126314@163.com", "这里是密码,就不写啦");//设置登录邮箱的账号,密码
ts.sendMessage(message, message.getAllRecipients());
ts.close();
System.out.print("here is sendMailThread......sending is successfull");
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面再Action中new出这个工具类,再启动
//以上代码省略
//封装参数
User user = new User(null,username,password,phone,address,email);
//生成一个激活码号,用于账户激活
user.setCode(UUID.randomUUID().toString());
//发送邮件,单独启动一个线程
SendMailThread st = new SendMailThread(user);
st.start();
//以下代码省略
不知道你这个问题现在有没有解决,我说一下我的看法。首先是要明确你新开的激活线程和你的主线程(你的注册请求)是通过JVM分配交替执行的。也就是说有可能你开的线程还没有执行,你的主线程已经执行完了,也就是说你激活线程后面的逻辑先执行完了,也就是主线程已经结束。因为激活线程是主线程的子线程,所以子线程来没来得及执行就销毁了。你可以在你激活线程的后面debug测试一下
还没有解决,
说的有道理!那子线程的任务该怎么办才能执行?
【 在 mh250303135 (javazealots) 的大作中提到: 】
: 不知道你这个问题现在有没有解决,我说一下我的看法。首先是要明确你新开的激活线程和你的主线程(你的注册请求)是通过JVM分配交替执行的。也就是说有可能你开的线程还没有执行,你的主线程已经执行完了,也就是说你激活线程后面的逻辑先执行完了,也就是主线程已经结束。因为激活线程是主线程的子线程,所以子线程来没来得及执行就销毁了。你可以在你激活线程的后面debug测试一下
通过『我邮2.0』发布