如何编写一个基于会话的执行程序,一次只在该会话中运行一件事?

时间:2016-04-30 19:31:52

标签: java multithreading

在nio中,您可以从许多套接字获取数据,并且需要将此数据按顺序提供给SSL引擎或http解析器。我一直在考虑使用类似的接口创建一个SessionExecutor(这将有许多线程仍然按顺序保存来自相同键的数据)

 public void execute(Object key, Runnable r);

我还希望一个键不要绑定到线程池中的一个线程。当我从key = 1接收东西时,runnable = A,B,C,这些runnables必须运行A,然后运行B,然后运行C,但理想情况下不必运行在同一个线程上(即我们不需要一个密钥)哈希到同一个线程,在同一个哈希/线程上饿死另一个键)。但是,我们希望B runnable在A runnable完成运行之前不会运行。

这最终成为一个非常有趣的算法问题。如果我最终得到1000个套接字,我不确定我是否想拥有1000个队列。如果我只有1个队列,那么我需要查看所有传入的runnable及其密钥,并确保密钥不可运行,并且每次都必须遍历队列。

我希望能比它快一点。

更好的是,这样的事情已经存在吗?我不会碰巧知道任何事情。

编辑:我想更多关于这一点,我倾向于想知道是否有一个好的算法/数据结构可以支持这样的事情,你有一个队列和队列中的N个通道有某种特殊的顺序。或者,如果这是混合数据结构来实现这一点。我想我现在需要某种混合。

1 个答案:

答案 0 :(得分:0)

我抓住了这个并想出了类似的东西

https://github.com/deanhiller/webpieces/blob/master/core-util/src/main/java/org/webpieces/util/threading/SessionExecutorImpl.java

我仍然想知道其他东西是否会更高效......不确定,但是过早的优化是所有邪恶的根源......所有这些......我现在就会这样做。

相关问题