`
jimmee
  • 浏览: 537976 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

线程池中, 怎么保证的一个会话数据的有序性

阅读更多

0. 线程池中, 怎么保证的一个会话数据的有序性

 

   既然用到了线程池, 并不要求始终是同一个线程执行同一个会话的数据, 只要保证多个线程执行的同一个会话

的数据在时间上的有序性即可.

 

   原理其实很简单, 每个会话的数据依次放到一个队列中. 特定时刻, 只有一个线程从此队列中读取数据执行.

 

借用netty中保持同一会话有序性的线程池的实现类的OrderedMemoryAwareThreadPoolExecutor说明, 线程之间操作

的流程示意如下:

 

 

 Thread X: --- Channel A (Event A1) --.   .-- Channel B (Event B2) --- Channel B (Event B3) 
                                       \ /
                                        X
                                       / \
 Thread Y: --- Channel B (Event B1) --'   '-- Channel A (Event A2) --- Channel A (Event A3) 

 

 

 

1. 代码层面

 

 // 每个channel对应的Executor, 具体实现是ChildExecutor

 

 private final ConcurrentMap<Object, Executor> childExecutors = newChildExecutorMap();

 

 

 // ChildExecutor的添加任务的实现, 实际是添加到一个线性列表中

 

private final LinkedList<Runnable> tasks = new LinkedList<Runnable>();


         public void execute(Runnable command) {
            boolean needsExecution;
            synchronized (tasks) {
                needsExecution = tasks.isEmpty();
                tasks.add(command);
            }

            if (needsExecution) {
                doUnorderedExecute(this);
            }
        } 

 

 

  // 具体的执行(实际是其他线程调用此Executor的run方法

 

 public void run() {
            Thread thread = Thread.currentThread();
            for (;;) {
                final Runnable task;
                synchronized (tasks) {
                    task = tasks.getFirst();
                }

                boolean ran = false;
                beforeExecute(thread, task);
                try {
                    task.run();
                    ran = true;
                    onAfterExecute(task, null);
                } catch (RuntimeException e) {
                    if (!ran) {
                        onAfterExecute(task, e);
                    }
                    throw e;
                } finally {
                    synchronized (tasks) {
                        tasks.removeFirst();
                        if (tasks.isEmpty()) {
                            break;
                        }
                    }
                }
            }
        }

 

 

分享到:
评论

相关推荐

    流媒体转发设计,支持rtp,封装libuv

    本设计主要涉及的是一个支持RTP协议并基于libuv库的流媒体转发服务器,其核心目标是实现高效、稳定的数据传输,以满足大规模并发用户的需求。 RTP(Real-time Transport Protocol)是一种用于在IP网络上传输实时...

    websocket简易聊天室

    在聊天室的实现中,为了保证消息的有序性和一致性,通常会引入消息ID和序列号。服务器收到消息后,可能需要进行一些业务处理,如验证用户权限,然后将消息广播给其他在线用户。为了提高性能,可以考虑使用异步编程...

    Java编程聊天程序下载

    此外,为了实现多用户同时在线聊天,服务器需要维护一个线程池,每个客户端连接都会分配一个独立的线程处理其发送和接收的消息,以确保并发性能。Java的`ExecutorService`和`ThreadPoolExecutor`可以很好地管理这些...

    Java群聊天室

    Java群聊天室是一款基于Java编程语言开发的多用户实时交流平台,它采用了多线程技术以确保用户间的并发通信,并且在数据传输过程中融入了网络安全的加密机制,以保障信息的隐私与安全性。这个程序的核心设计是实现一...

    网络cmd 聊天

    服务器需要维护一个客户端连接列表,以便管理每个客户端的会话。当有新消息从客户端发送过来时,服务器会广播这个消息到所有已连接的客户端,使得所有在线用户都能看到新消息。 在实现网络CMD聊天系统时,开发者...

    java多线程_设计模式_各种技术(我的书架)

    此外,Java还提供了 volatile 关键字,保证了内存可见性和有序性,以及 Lock 接口及其实现,如 ReentrantLock,提供了更细粒度的锁控制。 设计模式是软件工程中的最佳实践,是解决常见问题的模板。在Java中,有23种...

    数组和集合

    Java中的数组是一个类,这使得它在Java语言中具有特别的地位。数组可以用来存储基本数据类型(如int, double等)或引用数据类型(如String, 对象等)。数组声明后必须初始化,使用new关键字分配内存空间,并且指定...

    KChat.tar.gz_KChat-聊天工具_all25p_java聊天工具

    例如,如何保证消息的有序性和可靠性,如何处理网络延迟和丢包,以及如何优化性能以应对大量并发连接。KChat可能采用了诸如心跳机制、消息确认策略以及合理的线程池管理等手段来解决这些问题。 总结,KChat是一个...

    简易聊天室设计

    3. **会话管理**:登录成功后,服务器会给用户分配一个会话标识(session ID),用于识别用户的后续请求,防止未授权的访问。这个标识通常存储在服务器端或客户端的cookie中。 其次,聊天系统是聊天室的核心,它...

    北科Java新面试宝典.pdf

    4. TreeSet如何保证对象的有序性:通过比较器来确保对象的有序性。 5. HashTable、HashMap、TreeMap的区别:HashTable是线程安全的,HashMap是非线程安全的,TreeMap是基于红黑树实现的。 6. HashMap的底层数据存储...

    C# TCP的多对多聊天源码

    2. **客户端**:客户端首先会尝试连接到服务器,然后在一个持续的会话中发送和接收消息。客户端界面通常会展示聊天历史,并有一个输入框供用户输入消息。 3. **消息处理**:在服务器和客户端之间传输的消息需要进行...

    即时通讯 qqserver

    它提供了丰富的API和功能,使得开发者能够快速搭建起一个稳定、高效、可扩展的即时通讯平台。通过研究和理解QQServer的源码,我们可以深入学习到网络编程、多线程、消息队列以及分布式系统设计等重要技术。 首先,...

    java必备知识点大全.pdf

    线程和进程的区别:进程是系统进行资源分配和调度的一个独立单位,线程是进程中的一个实体,是CPU调度和分派的基本单位。 JVM的内存结构:包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。 内存泄露和内存溢出...

    java面试问题汇总(非常全面)

    SessionId 是用来标识一个特定用户的会话的唯一标识符,由服务器生成并在客户端保存,通常存储在 Cookie 中。服务器可以通过 SessionId 来跟踪用户的状态。 #### 8. Session的机制 - 用户首次访问时,服务器为该...

    多人聊天程序源代码.rar

    每个用户会话或聊天窗口都在一个独立的线程中运行,使得用户可以在接收和发送消息的同时执行其他操作,如查看好友列表,而不阻塞主线程。 3. **套接字编程**:套接字是网络编程的基本接口,用于在网络中建立和维护...

    今日头条校园招聘历年经典面试题汇总:C++研发1

    5. **事务**:在关系型数据库中,事务是保证数据一致性的重要概念,它包含ACID特性:原子性、一致性、隔离性和持久性。 6. **数据库索引**:索引用于加速查询,常见类型如B树、B+树等,可以显著提高数据检索速度,...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.41.docx

    答案:Docker 是一个开源的应用容器引擎,它允许开发者打包应用及其依赖环境到一个可移植的容器中,然后在任何支持 Docker 的平台上运行。Docker 在软件开发中的作用包括提供一致的运行环境、简化部署流程、提高资源...

    基于JainSip的聊天室程序

    总的来说,"基于JainSip的聊天室程序"是一个很好的学习项目,它结合了理论与实践,既可以帮助我们掌握SIP协议的细节,也能提升我们的Java编程能力。通过分析和调试程序,我们可以深入理解JainSip库的功能,以及如何...

    Java学科面试宝典.pdf

    理解它们之间的区别和应用场景,如线程安全、遍历效率、元素有序性等,是面试中常见的问题。此外,了解泛型、迭代器、并发集合(如ConcurrentHashMap)以及Stream API的使用也是必要的。 三、Java多线程 多线程编程...

    mina框架demo

    - **Session**:表示客户端和服务器之间的一个连接实例,包含了会话状态和相关的I/O操作。 - **Filter Chain**:MINA的过滤器链机制允许自定义的处理逻辑,每个过滤器可以对数据进行处理、拦截或转换。 - **...

Global site tag (gtag.js) - Google Analytics