我除了一个主线程以外,有一个a线程是一开始就启动并轮询用户是否在线的,还有一个b线程是响应用户请求去执行I/O操作的。
a线程只有一个实例,b线程是只要有一个用户请求就实例化一个并且开启的。我想要的结果是a线程处于不断的轮询状态,b线程接受新用户请求时,既可以保证之前开启的线程处于执行状态又要保证新线程开始执行。
但我得到的结果是,a线程是处于不断轮询状态,但是有新用户请求时,之前的b线程会阻塞,过了一段时间之前的b线程才会继续执行,我想要的结果是新的b线程和旧的b线程轮流执行。
ServletA 中的a线程
public void init()
{
new Thread(){
public void run(){
while(true){
OnlineUserBean onlineUserBean = OnlineUserBean.getInstance();
synchronized (onlineUserBean) {
// 隔n秒检查一次用户是否在线
try {
// 阻塞并且释放锁
onlineUserBean.wait(5000);
} catch (Exception e) {
e.printStackTrace();
}
long curTime = System.currentTimeMillis();
onlineUserBean.sortOnline(curTime, logger);
// 输入当前在线用户列表给后台查看
logger.info("sortOnline");
}
}
}
}.start();
}
ServletB中的b线程
public void brush(final HttpClient bigClient, final HttpClient smallClient,
String radio, final UserInfo userInfo, final String selectId) {
final int times = Integer.parseInt(radio);
new Thread(){
public void run(){
try{
for(int i=0; i<times; i++){
OnlineUserBean onlineUserBean = OnlineUserBean.getInstance();
//小号访问大号主页
boolean result = visit(smallClient, userInfo.getUserId());
if(result){
logger.info("visitBigName is "+userInfo.getUserName()+(i+1));
}else{
logger.info("visit fail! ! ! ! ! !");
}
synchronized (onlineUserBean) {
// sleep5秒
try {
onlineUserBean.wait(100);
} catch (InterruptedException e) {
logger.info("brush.thread.error is: " + e);
return;
}
}
// 大号删除小号脚印
deleteFoot(bigClient, selectId);
synchronized (onlineUserBean) {
// sleep5秒
try {
onlineUserBean.wait(100);
} catch (InterruptedException e) {
logger.info("brush.thread.error is: " + e);
return;
}
}
// 更新当前访问量
Get get = new Get();
ParseHTML parseHTML = new ParseHTML();
String html2 = get.doGet(bigClient, "http://www.renren.com/"
+userInfo.getUserId()+"/profile", "profile");
String curFoots = parseHTML.getFoots(html2);
onlineUserBean.setUserfoot(userInfo.getUserId(), curFoots);
}
}catch (Exception e) {
e.printStackTrace();
logger.info("brush.thread.error is: "+e);
}finally{
//
logger.info("finally");
// 通知该小号id空闲
OnlineUserBean.getInstance().addFreeUserIdList(userInfo.getUserId());
OnlineUserBean.getInstance().addFreeUserIdList(selectId);
OnlineUserBean.getInstance().removeFromBusyUserList(userInfo.getUserId());
OnlineUserBean.getInstance().removeFromBusyUserList(selectId);
}
}
}.start();
}