Java多线程之可调用的和未来的案例分析

  介绍

小编给大家分享一下Java多线程之可调用的和未来的案例分析,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!

<强>调用和未来出现的原因

创建线程的2种方式,一种是直接继承线程,另外一种就是实现运行的接口。
这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
自从Java 1.5开始,就提供了可赎回和未来,通过它们可以在任务执行完毕之后得到任务执行结果。

<强>调用和未来介绍

可调用的接口代表一段可以调用并返回结果的代码;未来的接口表示异步任务,是还没有完成的任务给出的未来结果,所以说可调用的用于产生结果,未来用于获取结果。
可调用的接口使用泛型去定义它的返回类型.Executors类提供了一些有用的方法在线程池中执行可调用内的任务。由于可调用的任务是并行的(并行就是整体看上去是并行的,其实在某个时间点只有一个线程在执行),我们必须等待它返回的结果。
java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交可调用的任务后返回了一个未来的对象,使用它可以知道可调用的任务的状态和得到的返回的执行结果.Future提供了得到()方法让我们可以等待调用结束并获取它的执行结果。

<强>调用与Runnable

java.lang.Runnable吧,它是一个接口,在它里面只声明了一个运行()方法:

公共接口可运行{   公共抽象空运行();   }

由运行于()方法返回值为空白类型,所以在执行完任务之后无法返回任何结果。

调用位于java . util . concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做电话():

公共接口Callable{/* *   *计算结果,或者抛出一个异常如果无法这样做。   *   * @return计算结果   * @throws异常如果无法计算的结果   */V叫()抛出异常;   }

这是一个泛型接口,叫()函数返回的类型就是传递进来的V类型。

可调用的使用

一般情况下是配合ExecutorService来使用的,在ExecutorService接口中声明了若干个提交方法的重载版本。

& lt; T>Future提交(Callable任务);   & lt; T>Future提交(T可运行的任务,结果);   Future<?比;提交(Runnable任务);

第一个提交方法里面的参数类型就是可调用的。

暂时只需要知道可调用一般是和ExecutorService配合来使用的,具体的使用方法讲在后面讲述。

一般情况下我们使用第一个提交方法和第三个提交方法,第二个提交方法很少使用。

未来就是对于具体的Runnable或者可调用的任务的执行结果进行取消,查询是否完成,获取结果。必要时可以通过得到方法获取执行结果,该方法会阻塞直到任务返回结果。

未来类位于java.util。concurrent包下,它是一个接口:

公共接口Future{   布尔取消(布尔mayInterruptIfRunning);   布尔isCancelled ();   布尔结束();   V get()抛出InterruptedException, ExecutionException;   V获得(长超时,TimeUnit unit)   抛出InterruptedException,中TimeoutException;   } <编辑>在未来接口中声明了5个方法、下面依次解释每个方法的作用 <李>

取消方法用来取消任务,如果取消任务成功则返回真,如果取消任务失败则返回假。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置为真,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为真正的还是假,此方法肯定返回假,即如果取消已经完成的任务会返回假;如果任务正在执行,若mayInterruptIfRunning设置为真,则返回真,若mayInterruptIfRunning设置为假,则返回假;如果任务还没有执行,则无论mayInterruptIfRunning还为真的是假的,肯定返回真的。

<李>

isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回真的。

<李>

结束方法表示任务是否已经完成,若任务完成,则返回正确的;

<李>

得到()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

<李>

得到(长超时,TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回零。

Java多线程之可调用的和未来的案例分析