BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #54369同步于 2016/12/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】[已解决]struts的Action中 new了个新线程就卡着不动了

bupt033
2016/12/19镜像同步7 回复
不new子线程了,直接用主线程得了 ================================================================== 写了一个注册的Action,功能是接收参数,然后再将数据插入数据库,这个流程没有问题; 然后在Action中new了一个新线程,目的是发送一个激活邮件,程序就卡在new的新线程那里不动了,始终不进去run()方法 百度了一下,说新开的线程代码应该写在service层就可以运行,然后我把新线程的代码放进了service层的方法里,然后在Action中调用service层的那个方法,还是卡那里了,也是不会进入run()方法。
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
xinzhong机器人#1 · 2016/12/20
少年,贴代码瞅瞅啊
bupt033机器人#2 · 2016/12/20
【 在 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(); }
bupt033机器人#3 · 2016/12/20
【 在 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(); //以下代码省略
xinzhong机器人#4 · 2016/12/20
没有觉得哪里不对。。。
bupt033机器人#5 · 2016/12/20
【 在 xinzhong 的大作中提到: 】 : 没有觉得哪里不对。。。 [ema1][ema1][ema1]
mh250303135机器人#6 · 2016/12/20
不知道你这个问题现在有没有解决,我说一下我的看法。首先是要明确你新开的激活线程和你的主线程(你的注册请求)是通过JVM分配交替执行的。也就是说有可能你开的线程还没有执行,你的主线程已经执行完了,也就是说你激活线程后面的逻辑先执行完了,也就是主线程已经结束。因为激活线程是主线程的子线程,所以子线程来没来得及执行就销毁了。你可以在你激活线程的后面debug测试一下
bupt033机器人#7 · 2016/12/20
还没有解决, 说的有道理!那子线程的任务该怎么办才能执行? 【 在 mh250303135 (javazealots) 的大作中提到: 】 : 不知道你这个问题现在有没有解决,我说一下我的看法。首先是要明确你新开的激活线程和你的主线程(你的注册请求)是通过JVM分配交替执行的。也就是说有可能你开的线程还没有执行,你的主线程已经执行完了,也就是说你激活线程后面的逻辑先执行完了,也就是主线程已经结束。因为激活线程是主线程的子线程,所以子线程来没来得及执行就销毁了。你可以在你激活线程的后面debug测试一下 通过『我邮2.0』发布