I would put a call to a third-party api, which takes a lot of time in Callable<DataTypeReturnedBy3rdPartAPI> , and then execute it with SingleThreadExecutor , specifying a timeout .
After this approach, the thread will be killed if calling a third-party API takes longer than timeOut , here is some code to demonstrate what I'm saying:
ExecutorService executor = Executors.newSingleThreadExecutor(); try { //================= HERE ================== Future<Boolean> job = executor.submit(thirdPartyCallable); executor.awaitTermination(timeOut, TimeUnit.SECONDS); if(!job.isDone()) logger.debug("Long call to 3rd party API didn't finish"); //========================================= } catch (Exception exc) { exc.printStackTrace(); } finally { if(!executor.isShutdown() ) executor.shutdownNow(); } } private static Callable<Boolean> thirdParytCallable = new Callable<Boolean>() { public Boolean call() throws Exception { //Call to long 3rd party API //....... for(long i = 0;i<99999991999999L;i++) { Thread.sleep(10L);// Emulates long call to 3rd party API System.out.print("."); } return Boolean.valueOf(true);//Data from 3rd party API } };
source share