使用线程池实现异步
起因:
项目需要调用一个http接口报:java.net.SocketTimeoutException: Read timed out。
解决方法:
public class RunnableTestMain { public static void main(String[] args) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); ExecutorService pool = Executors.newFixedThreadPool(3); //第一种方式execute(),不需要异步返回值 System.out.println("pool.execute()开始"+format.format(new Date())); pool.execute(new RunnaleTest()); System.out.println("pool.execute()结束"+format.format(new Date())); System.out.println("pool.submit()开始"+format.format(new Date())); //第二种方式submit(),需要异步返回值,方便Exception处理 Future future = pool.submit(new RunnaleTest()); //future.get()是一个阻塞方法,需要线程池submit()的所有异步线程执行完成才会执行 try { System.out.println("future是否结束:"+future.isDone()+format.format(new Date())); if (future.get()==null){ System.out.println("future.get()完成"+format.format(new Date())); pool.shutdown(); //关闭线程池 } } catch (InterruptedException e) { } catch (ExecutionException e){ System.out.println(e.getCause().getMessage()); } System.out.println("pool.submit()结束 "+format.format(new Date())); } } class RunnaleTest implements Runnable{ @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"开始"); Thread.sleep(1000); //你要调用的接口 System.out.println(Thread.currentThread().getName()+"结束"); }catch (InterruptedException e){ System.out.println(e.getCause().getMessage()); } } }
总结:
自己第一次写博客,请大家多多指教!