(FutureTask和Future) -使用方式 开启线程异步执行并可以阻塞得到返回值
一、 FutureTask 使用
/** * FutureTask -使用方式 * 开启一个线异步线程,并让主线程等待返回结果 */ public class FutureTaskSevice { public static void main(String[] args) { FutureTask<String> futureTask=new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { // todo int count=0; for(int i=0;i<10;i++){ count=count+i; } return "it is subThread complete-count:"+count; } }); // 通过线程执行 Thread thread=new Thread(futureTask); thread.start(); try { String resultStr = futureTask.get(); System.out.println("resultStr = " + resultStr); }catch (Exception e) { e.printStackTrace(); } System.out.println("I am is main Thread"); } }
二、Future 使用
//第二程使用线程池方法 // ThreadPoolExecutor threadPool=new ThreadPoolExecutor(5,10,30,TimeUnit.SECONDS,new ArrayBlockingQueue<>(20));// 也可以自定义线程池 ExecutorService executorService=Executors.newFixedThreadPool(5); Future<String> futureStr= executorService.submit(()->{ return "it is result"; }); try { System.out.println("futureStr.get() = " + futureStr.get());// 此处会阻塞等待 } catch (Exception e) { e.printStackTrace(); } System.out.println("I am is main Thread-2");
重点:(FutureTask和Future)-使用方式 开启线程异步执行并可以阻塞得到返回值,如当一个任务比较耗时,主线程执行一个任务,开启一个线程执行一个任务,最后需要两个线程的结果,就需要主线程执行完后等待子线程的执行结果;实例如一次分页数据请求,主线程可以获取列表数据,子线程可以开启执行统计总行数,最后汇总两个结果一起返回到页面。