我认为,在大多数情况下,ArrayBlockingQueue表现会比表现更好LinkedBlockingQueue.但是,当数组中总有足够的空间时就是这种情况......如果它已经满了,那么它是否会表现得如此之好是不可预测的,因为它会阻塞试图将数据推入队列的线程. .
所以,我的问题是:是否有任何中间实施BlockingQueue?说,一个ArrayListBlockingQueue或一个BucketListBlockingQueue?类似于数组列表的东西,以便队列可以动态增加容量,同时仍然可以通过使用数组最终存储数据获得合理的好处?
在n个线程之间分配传入连接是否有益,每个线程都有自己独立的NIO Selector,其中n是服务器中的核心数量?假设我正在编写一个服务器,它应该处理许多客户端连接.我可以有类似的东西:
selector.select();
Iterator<SelectionKey> i = selector.selectedKeys().iterator();
while (i.hasNext()) {
SelectionKey key = i.next();
i.remove();
if (!key.isValid())
continue;
if (key.isAcceptable()) {
// get one of the n selectors (I'd have one per core)
Selector chosenSelector = getRandomSelector();
// delegate the new connection to the chosen selector
SocketChannel newChannel = key.channel.accept();
newChannel.configureBlocking(false);
newChannel.register(chosenSelector, SelectionKey.OP_READ);
}
}
Run Code Online (Sandbox Code Playgroud)
你们认为这有道理吗?我的意思是,运行n个线程,每个线程都有不同的选择器?或者我应该坚持使用一个单一的选择器线程来处理所有连接的OP_READ?或者别的什么?
假设我有方法
void m1(Object... objs) {
m2("added", objs);
}
Run Code Online (Sandbox Code Playgroud)
和
void m2(Object... objs) {
for (Object o : objs) {
// do something with Object o
}
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话m1("a", "b"),我想m2看到3个对象的数组(字符串"添加","a"和"b").但是,m2只看到2个对象:字符串"已添加"和一个Object[]数组,其内部包含字符串"a"和"b".
我怎样才能获得所需的行为,也就是说,我只是在将它们转发给另一种方法之前将元素添加到varargs中?
我更习惯C++.要获取类的所有实例的列表(这是一个可以由用户扩展的库类),我通常有一个静态容器,其中包含对这些对象的所有引用:
#include <list>
class CPPClass;
class CPPClass {
public:
CPPClass() {
objList.push_back(this);
}
~CPPClass() {
objList.remove(this);
}
private:
static std::list<CPPClass *> objList;
};
std::list<CPPClass *> CPPClass::objList;
Run Code Online (Sandbox Code Playgroud)
我应该如何在Java中做同样的事情?我有一些顾虑:
有没有办法找出用Kryo序列化对象后返回的字节数组有多大?还是我必须实际对其进行序列化,然后检查阵列的长度?
例如,使用LZ4,在压缩字节数组之前,即使在压缩之前,我也可以获得压缩大小的界限。
我有一个包含不同模块的大型存储库,它应该在不同的存储库中分解,每个模块一个.有时我featbranch在回购中创建了一个分支来处理特定模块,但featbranch对其他模块没有任何意义.你可以想象这可能造成的混乱......
无论如何,我的问题是:如何获得更改特定文件的最新提交,以及可能属于哪个分支?通过"最新",我只是指时间戳最高的那个,据我所知,来自不同分支的提交可能没有任何优先关系.
我找到了这个实现char * strchr (const char *string, int c);:
for (;;)
if (*string == c)
return (char *) string;
else if (*string == '\0')
return NULL;
else
string++;
Run Code Online (Sandbox Code Playgroud)
但对我来说,这相当于执行以下操作,这将更容易阅读:
while (*string != c && *string != '\0')
string++;
return (*string == c) ? ((char *) string) : (NULL);
Run Code Online (Sandbox Code Playgroud)
我认为libc有一些原因可以实现第一个.但任何看法背后的原因是什么?