用Future实现Timeout,Call方法已经返回,但Future.get方法没有得到,而出了timeoutException

夏天的小虫 2012-06-13 03:21:00
如题,用java的Future接口去实现socket阻塞read的timeout功能。可能有时call方法返回了,外面还是得不到


ExecutorService receiveExecutor = Executors.newSingleThreadExecutor();

FutureTask<CommCodec.Frame> receiveFuture=new FutureTask<CommCodec.Frame>(new Callable<CommCodec.Frame>() {

public Frame call() throws Exception {
// TODO Auto-generated method stub
Frame recFrame=null;
byte[] resultBuffer = new byte[1024];

int receiveCount=0;

try {
while(true)
{
byte[] receivedBuffer=new byte[512];
int size = mInputStream.read(receivedBuffer);
System.arraycopy(receivedBuffer, 0, resultBuffer, receiveCount, size);
receiveCount+=size;

recFrame=CommCodec.decodeBuffer(resultBuffer);
if(recFrame != null && recFrame.getType() != Frame.TYPE_UNKNOWN)
{
receivedBuffer=null;
Log.d(TAG, "Bluetooth.recFrame.getType = "+recFrame.getType()+"....received.bytes = "+Util.toHex(resultBuffer));

return recFrame;
}
}


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resultBuffer=null;
return recFrame;
}
});

receiveExecutor.execute(receiveFuture);

Frame fuFrame=null;
try {
fuFrame = receiveFuture.get(timeout, TimeUnit.MILLISECONDS); //取得结果,同时设置超时执行时间为5秒
} catch (InterruptedException e) {
Log.e(TAG, "InterruptedException...");
receiveFuture.cancel(true);
} catch (ExecutionException e) {
Log.e(TAG, "ExecutionException...");
receiveFuture.cancel(true);
} catch (TimeoutException e) {
Log.e(TAG, "TimeoutException...");
receiveFuture.cancel(true);
} finally {
receiveExecutor.shutdown();
receiveFuture=null;
receiveExecutor=null;
System.gc();
}
...全文
1123 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
RDroid 2012-06-13
  • 打赏
  • 举报
回复
打印语句,属于非同步的,不能根据打印语句的先手顺序看实际的多线程的执行顺序

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧