Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

常用的多线程异步处理


package cn.allinpalm.sns.app.web.point.action;

import java.util.LinkedList;

import org.apache.log4j.Logger;
import cn.allinpalm.sns.app.web.constants.Config;
import cn.allinpalm.sns.app.web.point.service.PointOptService;
import cn.allinpalm.sns.app.web.util.ParamBean;

public class Proccessor {

    
private static Logger log = Logger.getLogger(Proccessor.class);

    
class SubProc implements Runnable {

        LinkedList
<ParamBean> list = new LinkedList<ParamBean>();

        
void add(ParamBean pb) {
            
synchronized (list) {
                list.add(pb);
                list.notify();
//通知处理新任务
            }

        }


        
public void run() {
            ParamBean pb 
= null;
            
while (true{
                
try {
                    
synchronized (list) {

                        
if (list.size() > 0{    //存在需要处理的任务
                            pb = list.remove(0);  //将任务移出队列,并执行业务逻辑
                            UserOptAction.initPointUserOpt(pb);
                            
if (pb != null && (pb.getOptway()).equals(Config.addPointOpt)) {

                                PointOptService.userPointAdd(pb);
                            }
 else if (pb != null
                                    
&& (pb.getOptway())
                                            .equals(Config.consumePointOpt)) 
{
                                PointOptService.userPointConsume(pb);
                            }
                     
                            
                        }
 else {
                            list.wait();
//等待任务
                        }

                    }


                }
 catch (InterruptedException e) {
                    
break;
                }
 catch (Exception e) {
                    
break;
                }

            }


        }

    }


    
//单态模式取得实例变量并初始化
    private static Proccessor instance = null;

    
public static Proccessor getInstance() {
        
if (instance == null{
            instance 
= new Proccessor();
            instance.init();
        }

        
return instance;
    }


    
int max = 20;    //创建线程最大数目
    SubProc[] procs = null

    
//初始化创建20个SubProc对象线程,并启动
    private void init() {
        procs 
= new SubProc[max];
        
for (int i = 0; i < max; i++{
            procs[i] 
= new SubProc();
            
new Thread(procs[i]).start();
        }

    }


    
//ParamBean为业务中参数的封装Bean,利用hashCode来处理
    
//将统一用户的调用放到一个线程统一处理,类似将同一用户的访问排队
    public void dispatch(ParamBean pb) {

        
if (pb != null && procs != null{
            
int i = pb.getUserid().hashCode() % max; 
            
if (i < 0{
                i 
= -i;
            }

            procs[i].add(pb);  
//加入线程中处理
        }

    }


}

aciont中调用:
    //ation中调用
    public ActionForward userPointAddOpt(ActionMapping mapping,
            ActionForm form, HttpServletRequest request,
            HttpServletResponse response) 
throws Exception {

        ParamBean pb 
= getParamBeanPk(request, response);                 
        Proccessor.getInstance().dispatch(pb);
        
    }

posted on 2008-03-07 14:13 都市淘沙者 阅读(2594) 评论(0)  编辑  收藏 所属分类: Java Basic/Lucene/开源资料


只有注册用户登录后才能发表评论。


网站导航: