java future callable

有个需求,数据库有两个字段,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());
            }
        }
    }
}

运行结果,某些请求会超过我们设定的时间,如果还未完成,就继续处理下一个。至少没有假死掉

原文地址:https://www.cnblogs.com/fangyuandoit/p/13713807.html