java threadpool用法_Java ThreadPoolExecutor的使用

/**

* 内部消息出传送对象,单例对象.

* 注意:如果是多线程在处理,那么对于那种有明确先后处理次序的消息不能使用。

* */

public class InnerMsgTransfer {

private static InnerMsgTransfer instance ;

private Logger log =LoggerFactory.getLogger(this.getClass()) ;

/**

* 监听者缓存

* */

private final ConcurrentHashMap> listenerMap =

new ConcurrentHashMap>() ;

/**

* 线程池

* 参数1:保留的线程池大小.如果希望是单线程,则改为1

* 参数2:线程池的最大大小

* 参数3:空闲线程结束的超时时间

* 参数4: 空闲线程结束的超时时间的单位

* 参数5:存放任务的队列

* */

private final ThreadPoolExecutor executor =

new ThreadPoolExecutor(3, 6, 1, TimeUnit.MINUTES,new LinkedBlockingQueue());

private InnerMsgTransfer(){}

public static InnerMsgTransfer getInstance(){

if(instance == null){

synchronized(InnerMsgTransfer.class){

if(instance == null){

instance = new InnerMsgTransfer() ;

}

}

}

return instance ;

}

/**

* 注册内部消息监听器(消费者)

* @param listener 消息的消费者

* @param msgType 消息类型

* */

public void registerInnerMsgListener(InnerMsgListener listener,InnerMsgTypeEnum msgType){

if(msgType == null){

return ;

}

//所有的监听者

Set listeners = listenerMap.get(msgType) ;

if(listeners == null){

synchronized(this){

if(listeners == null) {

listeners = new HashSet() ;

listenerMap.put(msgType, listeners) ;

}

}

}

listeners.add(listener) ;

}

/**

* 发送内部消息

* @param msgType 消息类型

* @param msg 传送的消息

* */

public void transferInnerMsg(InnerMsgTypeEnum msgType,Object msg){

if(msgType == null){

return;

}

executor.execute(new InnerMsgTask(msgType,msg));

}

/**

* 内部类,用于缓存内部消息

* */

private class InnerMsgTask implements Runnable{

public InnerMsgTypeEnum msgType ;

public Object msg ;

public InnerMsgTask(InnerMsgTypeEnum msgType,Object msg){

this.msgType = msgType ;

this.msg = msg ;

}

@Override

public void run() {

//所有的监听者

Set listeners = listenerMap.get(msgType) ;

if(listeners == null){

return ;

}

for(InnerMsgListener listener:listeners){

listener.onInnerMsg(msgType, msg);

}

}

}

public static void main(String[] args){

InnerMsgTransfer transfer = InnerMsgTransfer.getInstance() ;

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "1");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "2");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "3");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "4");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "5");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "6");

transfer.transferInnerMsg(InnerMsgTypeEnum.AREA_DELE, "7");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值