小编Edu*_*rra的帖子

Java:ArrayBlockingQueue与LinkedBlockingQueue

我认为,在大多数情况下,ArrayBlockingQueue表现会比表现更好LinkedBlockingQueue.但是,当数组中总有足够的空间时就是这种情况......如果它已经满了,那么它是否会表现得如此之好是不可预测的,因为它会阻塞试图将数据推入队列的线程. .

所以,我的问题是:是否有任何中间实施BlockingQueue?说,一个ArrayListBlockingQueue或一个BucketListBlockingQueue?类似于数组列表的东西,以便队列可以动态增加容量,同时仍然可以通过使用数组最终存储数据获得合理的好处?

java queue multithreading synchronization

17
推荐指数
2
解决办法
2万
查看次数

多个线程中的多个选择器

在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?或者别的什么?

java multithreading nio selector

9
推荐指数
1
解决办法
2764
查看次数

如何为varargs添加参数?

假设我有方法

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中?

java variadic-functions

8
推荐指数
2
解决办法
3404
查看次数

Java:如何存储对类的所有实例的引用?

我更习惯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中做同样的事情?我有一些顾虑:

  • 有人向我提到可能有多个类加载器,这可能会导致问题
  • java中没有析构函数,那么如何从列表中删除引用?
  • 如果没有删除引用,这些对象什么时候被垃圾收集?

java static garbage-collection

7
推荐指数
1
解决办法
1397
查看次数

如何快速获得序列化的大小?

有没有办法找出用Kryo序列化对象后返回的字节数组有多大?还是我必须实际对其进行序列化,然后检查阵列的长度?

例如,使用LZ4,在压缩字节数组之前,即使在压缩之前,我也可以获得压缩大小的界限。

java serialization kryo

5
推荐指数
0
解决办法
178
查看次数

git:如何获取特定文件的最新提交,而不管分支?

我有一个包含不同模块的大型存储库,它应该在不同的存储库中分解,每个模块一个.有时我featbranch在回购中创建了一个分支来处理特定模块,但featbranch对其他模块没有任何意义.你可以想象这可能造成的混乱......

无论如何,我的问题是:如何获得更改特定文件的最新提交,以及可能属于哪个分支?通过"最新",我只是指时间戳最高的那个,据我所知,来自不同分支的提交可能没有任何优先关系.

git branch commit

2
推荐指数
1
解决办法
422
查看次数

C:使用for(;;)有什么好处吗?

我找到了这个实现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有一些原因可以实现第一个.但任何看法背后的原因是什么?

c

1
推荐指数
1
解决办法
97
查看次数