有个需求,数据库有两个字段,ip和端口。是很多其他数据库的地址。现在需要下载这些数据库的数据
之前的做法是
while(true){
数据库读出一行为下载的数据
下载数据
}
但是下载数据的时候可能会假死,然后线程阻塞了。除非重启继续下载。
现在采用future和callable来配合下载。
callable来下载数据。 future来控制流程。
public class CallableDemo implements Callable<String> {
@Override
public String call() throws Exception {
//假设随机的运行时间
Random r =new Random();
int i = r.nextInt(5);
TimeUnit.SECONDS.sleep(i);
return "success";
}
}
public class FutureDemo {
public static void main(String[] args) throws Exception{
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
try {
CallableDemo callableDemo =new CallableDemo();
FutureTask<String> futureTask =new FutureTask(callableDemo);
executor.submit(futureTask);
String s = futureTask.get(3,TimeUnit.SECONDS);
System.out.println(s);
}catch (Exception e ){
System.err.println("e = "+e.getMessage());
}
}
}
}
运行结果,某些请求会超过我们设定的时间,如果还未完成,就继续处理下一个。至少没有假死掉