缓存期货并在完成时使用

时间:2014-04-19 12:42:55

标签: java multithreading caching collections concurrency

我想知道是否有办法缓存Futures,以便在完成时能够使用。例如,我有一个主线程产生一个从输入流读入的执行程序:

// pseudo code
while(true){
   Callable task = new Callable({
      // setup callable stuff here
      byte[] call(){
        return inputStream.readInBytes();
      }
   });
   Future f = executors.submit(task);
   byte[] b = f.get();  // blocks   Uggh

   // execute of b
   process(b);
}

我想知道是否有办法将期货放入收藏中,然后在完成时处理。

// pseudo code
while(true){
   Callable task = new Callable({
      // setup callable stuff here
      byte[] call(){
        return inputStream.readInBytes();
      }
   });
   Future f = executors.submit(task);

   futures.add(f);

   // process bytes as they completed.
   for(Future f: futures){
       if(f.isDone()){   // this doesn't always return valid.  It sometimes throws NPE's
         b = f.get();
         process (b);
       }
   }

}

我已经尝试了第二个代码片段,但它有时会抛出NPE - 我假设'isDone'方法正在刚启动的线程上调用,这就是问题(猜测)。

有人知道在他们开始完成之前缓存期货的方法吗?现在我的程序是连续工作的,但我正在寻找优化它并加快速度的方法。

感谢

1 个答案:

答案 0 :(得分:0)

我不会使用Byte[]而是使用byte[]或可循环使用的缓冲区。

如果要在数据可用时处理数据,请在后台线程中进行处理。

/* loop */ {
   futures.add(new Callable<Result>() {
      // setup callable stuff here
      Result call(){
           byte[] bytes = inputStream.readInBytes();
           return process(bytes);
      }
   });
}

// collect the results
for(Future<Result> f: futures){
    Result result = g.get();
    // do something single thread
}