这个题目比较怪,听俺道来。俺一直在负责公司游戏服务器的开发和维护,日积月累下来终于将原本混乱的代码和结构重构的比较清晰了,在此过程中的体会就是,重构啊,不仅仅是技术活,更多是要克服不情愿的、得过且过的心理去做,去做了才发现麻烦并没有想象中的大。
改造过程中遇到这么个问题,我想将对某个创建的游戏的操作都固定在一个线程执行,与其他游戏可以并发地处理;或者说依据游戏id派发到某个固定的线程处
理,对此游戏的操作都是串行化。不是俺不想彻底并行化,但是要将现有的代码改造成适应并行化相当困难,俺尝试的结果是问题百出,因此就想了这么个折中策
略,不同游戏之间的操作可以并行,单个游戏内操作串行。怎么派发呢?很简单的机制,根据id%size结果来处理就好,size就是你准备开的线程数。因
此可以很容易地模拟一个生产者消费者模型的线程池,根据游戏id%size的结果将任务塞到队列中,让生产者线程顺序处理。已经有部分代码是这样处理的,
不过是自己实现的模型(BlockingQueue),比较不适合俺想要的任务式的处理过程,灵机一动,jdk5引入的线程池不是有个单线程的版本吗?俺
将这个线程池再做个池不就OK了?说起来不好理解,看代码:
<!---->public
interface
Task
extends
Runnable {
public
int
getCode();
}
嗯,定义一个Task接口,继承Runnable,多了个getCode方法用于决定派发任务到哪个ExecutorService执行。线程池池登场:
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadPoolPool {
private Map<Integer, ExecutorService> threadPoolMap = new HashMap<Integer, ExecutorService>();
private int size;
public SingleThreadPoolPool(int size) {
this.size = size;
for (int i = 0; i < size; i++) {
ExecutorService executor = Executors.newSingleThreadExecutor();
threadPoolMap.put(i, executor);
}
}
public void execute(Task task) {
if (task == null)
return;
threadPoolMap.get(getIndex(task.getCode())).execute(task);
}
public void execute(int code, Runnable r) {
if (r == null)
return;
threadPoolMap.get(getIndex(code)).execute(r);
}
private int getIndex(int code) {
int index = -1;
if (code < 0)
index = 0;
else
index = code % this.size;
return index;
}
public void shutdown() {
for (int i = 0; i < size; i++) {
threadPoolMap.get(i).shutdown();
}
threadPoolMap.clear();
}
public int size() {
return this.size;
}
}
哇靠,这也太简单了,这就能保证code相同的任务会被排队顺序执行。是啊,很简单,不是啥高科技,但简单明了地实现了俺的需求。需要注意的是,只有通过Executor的execute方法提交的任务才会被排到队列中哦。
分享到:
相关推荐
对象池、线程池和数据库连接池都是资源复用机制的实例,它们有效地解决了频繁创建和销毁对象带来的开销,提高了系统的效率。以下是对这些概念的详细解释: 1. **对象池**: 对象池是一种设计模式,它的核心思想是...
这是一个很简单的实现啦对象池与线程池的融合,方法的主要参数,线程池大小、对象池大小、对象的创建工厂(继承接口自己实现),执行时传入方面名称即可。(invoke方法第一个为参数为方法名,第二是可变参数(及方法...
在IT领域,线程池和任务池是并发编程中的重要概念,特别是在C++这样的多线程支持的语言中。本文将详细探讨线程池和任务池的原理、实现以及它们在C++中的应用。 线程池是一种资源管理策略,它预先创建一组线程,待有...
里面是我个人通过模板来实现的通用池,并在通用池的基础上开发的一个线程池和数据库池。由于水平有限,所以开发的池可能比较简单。经过个人验证,这些池都是可用的,如有问题,可加QQ:970757285.
《C语言跨平台线程池任务池库:libstpool深度解析》 在现代软件开发中,多线程编程已经成为提升程序并发性能的重要手段。线程池作为一种优化资源分配和调度的技术,能够有效地管理和控制线程,降低系统开销,提高...
采用线程池 连接池 数据库 采用mysql,listcontr控件 右键菜单 此程序仅供学习 功能 增删改查学生,基本上各种非法操作验证都加了
在IT领域,线程池和连接池是两个关键的概念,特别是在服务器端的系统设计和优化中。它们在提高系统性能、资源管理和响应速度方面发挥着重要作用。本文将深入探讨Linux环境下的线程池和连接池,并结合C语言的epoll...
标题中的“IOCP 内存池线程池”是指一种高效、优化的系统设计模式,主要应用于处理大量的并发I/O操作。IOCP(I/O完成端口)是Windows操作系统提供的一种高级I/O模型,用于提高多线程环境下的I/O性能。它允许系统将I/...
服务端使用线程池实现。服务端主线程负责接收用 客户端请求,将客户端请求词封装成任务,再用锁机制 将任务添加到线程池中的任务队列中。工作线程通过互 斥量和条件变量访问任务队列,实现线程同步,使得线 程池...
在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927
线程池是一种多线程处理形式,它预先创建了若干数量的可执行线程并放在一个池子中,需要的时候直接拿来使用,使用完毕后再放回池中。线程池技术的优势在于:能够减少在创建和销毁线程上的开销;能够有效控制最大并发...
线程池和MySQL连接池是两种重要的资源管理技术,在多线程编程和数据库操作中扮演着关键角色。本文将详细探讨这两个概念,并结合在Ubuntu 12.04环境下使用C++实现线程池和MySQL连接池的方法。 线程池是一种优化并发...
Socket线程池是一种优化策略,用于管理大量的并发Socket连接。本篇将详细探讨Socket线程池的概念、工作原理以及它如何解决多个线程对同一个套接字进行写操作的问题。 首先,我们来理解什么是Socket。Socket是网络上...
线程池是一种多线程处理形式,预先创建一定数量的线程,放入池中,当有任务需要执行时,直接从池中获取线程来执行任务,而不是每次都创建新的线程,从而提高了系统资源的利用率,降低了系统开销。 线程池的核心组件...
作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,...
在实际应用中,线程池常用于数据库连接池、网络请求处理、大量计算任务等场景,通过合理使用线程池,可以显著提升程序的并发性能和响应速度。 总之,C++线程池是多线程编程中的一个重要工具,理解和掌握其设计与...
Kotlin线程池(单线程池、固定线程池、缓存线程池,定时+周期任务线程池)的封装
标题中的“工作队列池”和“线程池”是计算机科学中用于处理并发和多线程编程的重要概念。在高并发环境下,有效地管理和调度线程对于系统的性能和稳定性至关重要。接下来,我们将深入探讨这两个概念及其相关知识。 ...
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
线程池的基本思想是预先创建一组线程并将其放入池中,当有新的任务到来时,可以从池中取出一个空闲的线程来处理这个任务。具体来说: - **线程池创建和初始化**:在启动时,根据预设的参数创建一定数量的线程,并将...