我想知道是否有办法缓存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'方法正在刚启动的线程上调用,这就是问题(猜测)。
有人知道在他们开始完成之前缓存期货的方法吗?现在我的程序是连续工作的,但我正在寻找优化它并加快速度的方法。
感谢
答案 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
}