vir*_*wal 9 java multithreading
我正在编写一个应用程序,用户可以添加和删除其他用户作为朋友.我的页面有一个不同用户列表,每个用户都有一个按钮,可以将它们添加到好友列表中.我正在向Java servlet发送一个AJAX请求,以将所选用户添加为朋友.我在UI上显示警告消息以显示进程的结果.
我的问题是当用户被添加为朋友时我必须发送邮件这个代码是用servlet中的相同方法编写的.
由于这段代码我的警报信息来得很晚.
我需要运行一个单独的pthread来运行这个发送邮件功能,这样一旦添加了用户,我将得到结果,邮件将在单独的进程中发送.
我在Servlet中的代码是
private void sendMail(long inviteeID) {
User inviteeUser = null;
try {
inviteeUser = userHandler.getUser(inviteeID);
} catch (DataException e) {
sLog.error("User does not exist.", e);
} catch (UserNotFoundException e) {
sLog.error("User does not exist.", e);
}
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"vagarwal@q3tech.com", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
private String inviteAsFriend(long inviteeID) {
boolean result = false;
if (LoginHelper.isUserLoggedIn()) {
try {
User user = userHandler.findUserByEmail(LoginHelper
.getLoggedInUserEmail());
if (userHandler.isUserFriend(user.getUserId(), inviteeID)) {
if (userHandler.addFriend(user, inviteeID)) {
result = true;
return "Member added successfully as your friend.";
} else {
return "Member could not be added as your friend. Please try again later.";
}
} else {
return "Member is already your friend.";
}
} catch (DataException e) {
return "User does not exist.";
} catch (UserNotFoundException e) {
return "User does not exist.";
} catch (Exception e) {
return "Member could not be added as your friend. Please try again later.";
} finally {
if (result) {
sendMail(inviteeID);
}
}
} else {
return "User not logged in.";
}
}
Run Code Online (Sandbox Code Playgroud)
Boz*_*zho 14
我不确定这是不是问题.发送电子邮件并不是那么昂贵的操作 - 它只是通知SMTP服务器应该发送邮件,并且SMTP服务器从那里开始照顾.
不过,你可以尝试:
new Thread(new Runnable() {
public void run() {
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"vagarwal@q3tech.com", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
}).start();
Run Code Online (Sandbox Code Playgroud)
Ada*_*ski 11
我建议ExecutorService在你的servlet中定义一个,然后提交一个Runnable或者Callable到服务,以便执行发送电子邮件的工作.
private ExecutorService execService = Executors.newFixedThreadPool(1);
...
execService.submit(new Runnable()) {
public void run() {
// Send email.
}
};
Run Code Online (Sandbox Code Playgroud)
这种方法的优点包括:
Thread每次创建新操作的昂贵操作.ThreadPoolExecutor和重写afterExecute(Runnable, Throwable)或通过定义CompletionService检查每个已完成的结果来集中Runnable.在java 5或更高版本中相当简单:
private final ExecutorService executor = Executors.newFixedThreadPool(MAX_ALLOWED_THREADS);
private void sendMail(long inviteeID) {
User inviteeUser = null;
try {
inviteeUser = userHandler.getUser(inviteeID);
} catch (DataException e) {
sLog.error("User does not exist.", e);
} catch (UserNotFoundException e) {
sLog.error("User does not exist.", e);
}
executor.submit(new Runnable() {
public void run() {
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"vagarwal@q3tech.com", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
});
}
Run Code Online (Sandbox Code Playgroud)
PS.你可能需要做一些变量最终才能在runnable中使用它,但我会把它作为读者的练习:)
阅读文档:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html
您应该子类化 java.lang.Thread 来实现您的 run 方法。它可能就像您当前的 sendMail。然后,您在线程上调用 start 方法,当线程在后台执行时,控制立即返回到下一行代码。
| 归档时间: |
|
| 查看次数: |
16348 次 |
| 最近记录: |