java+线程池做消费者_java什么样的业务需求才需要开启线程池?

第一,同步锁,一般使用场景就是阻塞,唤醒操作,在开发RPC框架、分布式锁时,需要使用,其他场景并无任何意义。因为分布式环境下,保障数据一致性,可以依赖数据库mysql、缓存数据库redis、或者某中心服务器、分布式锁等。

第二、回答你的问题,我认为就得使用队列,生产者消费者,排队做事情,先进先出。

第三、什么业务需求需要多线程池。

java任何业务需求,都需要多线程池,除非你使用AIO+多进程,但是这并不能体现java虚拟机的强大,java虚拟机天生可以使用多核。

tomcat天生就tomcat线程

mysql、redis、mongodb等等任何都有他的线程,只不过他隐藏了(隐藏方式)

/**

* 获取数据

*

* @param ioSession

* 链接句柄

* @param tcpPacket

* 消息包

* @return

*/

public static TcpPacket lock(IoSession ioSession, TcpPacket tcpPacket) {

// 获取锁

WaitLock waitLock = getWaitLock();

// 设置此进程唯一id

tcpPacket.lockedId = waitLock.getInstanceId();

// 同步块

synchronized (waitLock) {

// 发送消息

ioSession.write(tcpPacket);

try {

// 等待解锁

waitLock.wait(waitLockTime);

} catch (InterruptedException e) {

if (MinaConfig.log != null) {

MinaConfig.log.error("获取数据超时", e);

}

}

}

// 解锁成功返回数据

return waitLock.getTcpPacket();

}

/**

* 唤醒同步块

*

* @param tcpPacket

* 返回的消息包

*/

public static void unLock(TcpPacket tcpPacket) {

// 如果没有此进程唯一的唤醒id则返回

if (tcpPacket.unlockedId == 0) {

return;

}

// 根据唤醒id获取锁对象

WaitLock waitLock = waitLockMap.get(tcpPacket.unlockedId);

// 携带消息包

waitLock.setTcpPacket(tcpPacket);

// 唤醒

synchronized (waitLock) {

waitLock.notify();

}

// 移除数组

waitLockMap.remove(tcpPacket.unlockedId);

}

tcp的更别说了,mina,netty专做网络层,消息推送、缓冲区、轮训检查基本都得用到多线程。

如果你想学多线程,可以看我写的RPC框架,做游戏、做网站、做通讯等都可以,有一套非常通用的多线程模型,grain-threadmsg。dianbaer/grain

下面是我原来做的mmorpg,虽然不维护了,有很高的参考价值,跟天龙八部的多线程架构一样,达到交互很高的水平

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值