很多朋友都想知道java future是什么,下面就一起来了解一下吧~
Future代表一个异步计算的结果,并且它提供一些方法来让调用者检测异步过程是否完成,或者取得异步计算的结果,或者取消正在执行的异步任务。
public class Test { private static ExecutorService executorService = Executors.newSingleThreadExecutor(); public static void main(String[]args){ System.out.println("hello world"); Futurefuture = calcute(9); while (!future.isDone()){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("正在执行"); } } try { int result = future.get(); System.out.println("result = " + result); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } public static Future calcute(Integer i) { return executorService.submit(() -> { Thread.sleep(1000); System.out.println("return future for " + i); return i *i; }); }}
一个简单Future使用用例写完,使用线程池+Callback+Future,完成了一个简单的计算操作。
Future是一个接口,先看一下内部方法:
public interface Future{ boolean cancel(boolean var1); boolean isCancelled(); boolean isDone(); V get() throws ExecutionException, InterruptedException; V get(long var1, TimeUnit var3) throws ExecutionException, InterruptedException, TimeoutException;}
get()函数是返回计算结果,注意get会同步操作,没有返回结果前,会阻塞线程。
get还有一个重载函数get(long var1, TimeUnit var3),第一个参数是时长,第二个是单位。
表示在多少时长内获取结果,如果仍未返回,则抛出异常TimeoutException。
try{ int result2 = future2.get(1000, TimeUnit.MILLISECONDS);} catch(TimeoutException e) { e.printStackTrace();}
cancel(boolean) 表示是否取消该future,
不能在调用cancel(true)/cancel(false)后,调用get()函数,否则会抛出异常CancellationException
isCancelled()函数是判断该future是否已取消
isDone()函数是判断该future是否已完成
isDone()函数是实时状态读取,不会阻塞线程。
Callback
Callback 是一个接口,内部只有一个函数
@FunctionalInterfacepublic interface Callable{ V call() throws Exception;}
以上就是小编今天的分享,希望可以帮到大家。