I found that ResponseFuture used some tips to keep future callback from being called multiple and keep semaphoreAsync from being released multiple, I think it was not elegant, and scanResponseTable would scan the on-going request list, it was too heavy.
- ScheduleExecutor replaces Timer, to issue per callback timeout. when timeout, check future is done? if not , clear responseTable item and invoke callback, if done, just clear responseTable item.
- ResponseFuture add isDone method, to check if future is done.