大家好,今天来为大家解答japonensisjavacomplete这个问题的一些问题点,包括JavaparserHDchanatimi也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
一.FutureJDK5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。
Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。
Future的接口很简单,只有五个方法。
publicinterfaceFuture<V>{nbooleancancel(booleanmayInterruptIfRunning);nbooleanisCancelled();nbooleanisDone();nVget()throwsInterruptedException,ExecutionException;nVget(longtimeout,TimeUnitunit)nthrowsInterruptedException,ExecutionException,TimeoutException;n}n
Future接口的方法介绍如下:
booleancancel(booleanmayInterruptIfRunning)取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束booleanisCancelled()任务是否已经取消,任务正常完成前将其取消,则返回truebooleanisDone()任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回trueVget()throwsInterruptedException,ExecutionException等待任务执行结束,然后获得V类型的结果。InterruptedException线程被中断异常,ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationExceptionVget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计算超时,将抛出TimeoutException一般情况下,我们会结合Callable和Future一起使用,通过ExecutorService的submit方法执行Callable,并返回Future。
ExecutorServiceexecutor=Executors.newCachedThreadPool();nFuture<String>future=executor.submit(()->{//Lambda是一个callable,提交后便立即执行,这里返回的是FutureTask实例nSystem.out.println("runningtask");nThread.sleep(10000);nreturn"returntask";n});ntry{nThread.sleep(1000);n}catch(InterruptedExceptione){n}nSystem.out.println("dosomethingelse");//前面的的Callable在其他线程中运行着,可以做一些其他的事情ntry{nSystem.out.println(future.get());//等待future的执行结果,执行完毕之后打印出来n}catch(InterruptedExceptione){n}catch(ExecutionExceptione){n}finally{nexecutor.shutdown();n}n
比起future.get(),其实更推荐使用get(longtimeout,TimeUnitunit)方法,设置了超时时间可以防止程序无限制的等待future的结果。
二.CompletableFuture介绍2.1Future模式的缺点
Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知的机制,我们无法得知Future什么时候完成。要么使用阻塞,在future.get()的地方等待future返回的结果,这时又变成同步操作。要么使用isDone()轮询地判断Future是否完成,这样会耗费CPU的资源。2.2CompletableFuture介绍
Netty、Guava分别扩展了Java的Future接口,方便异步编程。
Java8新增的CompletableFuture类正是吸收了所有GoogleGuava中ListenableFuture和SettableFuture的特征,还提供了其它强大的功能,让Java拥有了完整的非阻塞编程模型:Future、Promise和Callback(在Java8之前,只有无Callback的Future)。
CompletableFuture能够将回调放到与任务不同的线程中执行,也能将回调作为继续执行的同步函数,在与任务相同的线程中执行。它避免了传统回调最大的问题,那就是能够将控制流分离到不同的事件处理器中。
CompletableFuture弥补了Future模式的缺点。在异步的任务完成后,需要用其结果继续操作时,无需等待。可以直接通过thenAccept、thenApply、thenCompose等方式将前面异步处理的结果交给另外一个异步事件处理线程来处理。
三.CompletableFuture特性3.1CompletableFuture的静态工厂方法
runAsync和supplyAsync方法的区别是runAsync返回的CompletableFuture是没有返回值的。
CompletableFuture<Void>future=CompletableFuture.runAsync(()->{nSystem.out.println("Hello");n});ntry{nfuture.get();n}catch(InterruptedExceptione){ne.printStackTrace();n}catch(ExecutionExceptione){ne.printStackTrace();n}nSystem.out.println("CompletableFuture");n
而supplyAsync返回的CompletableFuture是由返回值的,下面的代码打印了future的返回值。
CompletableFuture<String>future=CompletableFuture.supplyAsync(()->"Hello");ntry{nSystem.out.println(future.get());n}catch(InterruptedExceptione){ne.printStackTrace();n}catch(ExecutionExceptione){ne.printStackTrace();n}nSystem.out.println("CompletableFuture");n
3.2Completable
future.get()在等待执行结果时,程序会一直block,如果此时调用complete(Tt)会立即执行。
CompletableFuture<String>future=CompletableFuture.supplyAsync(()->"Hello");nfuture.complete("World");ntry{nSystem.out.println(future.get());n}catch(InterruptedExceptione){ne.printStackTrace();n}catch(ExecutionExceptione){ne.printStackTrace();n}n
执行结果:
Worldn
可以看到future调用complete(Tt)会立即执行。但是complete(Tt)只能调用一次,后续的重复调用会失效。
如果future已经执行完毕能够返回结果,此时再调用complete(Tt)则会无效。
CompletableFuture<String>future=CompletableFuture.supplyAsync(()->"Hello");ntry{nThread.sleep(5000);n}catch(InterruptedExceptione){ne.printStackTrace();n}nfuture.complete("World");ntry{nSystem.out.println(future.get());n}catch(InterruptedExceptione){ne.printStackTrace();n}catch(ExecutionExceptione){ne.printStackTrace();n}n
执行结果:
Hellon
如果使用completeExceptionally(Throwableex)则抛出一个异常,而不是一个成功的结果。
CompletableFuture<String>future=CompletableFuture.supplyAsync(()->"Hello");nfuture.completeExceptionally(newException());ntry{nSystem.out.println(future.get());n}catch(InterruptedExceptione){ne.printStackTrace();n}catch(ExecutionExceptione){ne.printStackTrace();n}n
执行结果:
java.util.concurrent.ExecutionException:java.lang.Exceptionn...n
关于本次japonensisjavacomplete和JavaparserHDchanatimi的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。