import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author walter.fan@gmail.com
*/
public class AsyncTaskCaller<T> {
private static Log logger = LogFactory.getLog(AsyncTaskCaller.class);
private ExecutorService exec = null;
public AsyncTaskCaller(ExecutorService service) {
exec = service;
}
public Future<T> addTask(Callable<T> task) {
return exec.submit(task);
}
T getResult(Future<T> f, long timeoutMS) {
T result = null;
try {
result = f.get(timeoutMS, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
logger.error("ExecutionException:",e);
result = null;
} catch (TimeoutException e) {
logger.error("TimeoutException:",e);
result = null;
//f.cancel(true);
} catch(InterruptedException e) {
logger.error("InterruptedException:",e);
result = null;
}
return result;
}
public void shutdown() {
exec.shutdownNow();
}
/**
* @param args
*/
public static void main(String[] args) {
AsyncTaskCaller<String> caller = new AsyncTaskCaller<String>(Executors.newSingleThreadExecutor());
Callable<String> task = new Callable<String>() {
public String call() {
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (Exception e) {
logger.error("error: ",e);
}
return "Haha";
}};
Future f = caller.addTask(task);
String ret = caller.getResult(f,500);
System.out.println("ret="+ret);
ret = caller.getResult(f,1001);
System.out.println("ret="+ret);
caller.shutdown();
}
}
限时任务的实现
最新推荐文章于 2021-10-18 09:17:05 发布