ForkJoinPool类也允许以异步的方式执行任务。调用execute()方法发送3个初始任务到线程池中。在Main主类中,调用shutdown()方法结束线程池,并在控制台输出线程池中任务的状态及其变化的过程。ForkJoinPool类包含了多个方法可以实现这个目的。参考8.5节来查阅这些方法的详细列表。
本范例使用join()方法来等待任务的结束,然后获取它们的结果。也可以使用get()方法以下的两个版本来完成这个目的。
get():如果ForkJoinTask类执行结束,或者一直等到结束,那么get()方法的这个版本则返回由compute()方法返回的结果。
get(long timeout, TimeUnit unit):如果任务的结果未准备好,那么get()方法的这个版本将等待指定的时间。如果超过指定的时间了,任务的结果仍未准备好,那么这 个方法将返回null值。TimeUnit是一个枚举类,有如下的常量:DAYS、HOURS、MICROSECONDS、MILLISECONDS、MINUTES、NANOSECONDS和SECONDS。
get()方法和join()方法还存在两个主要的区别:
join()方法不能被中断,如果中断调用join()方法的线程,方法将抛出InterruptedException异常;
如果任务抛出任何运行时异常,那么get()方法将返回ExecutionException异常,但是join()方法将返回RuntimeException异常。
Java有两种类型的异常。
非运行时异常(Checked
Exception):这些异常必须在方法上通过throws子句抛出,或者在方法体内通过try{…}catch{…}方式进行捕捉处理。比如IOException或ClassNotFoundException异常。
运行时异常(Unchecked
Exception):这些异常不需要在方法上通过throws子句抛出,也不需要在方法体内通过try{…}catch{…}方式进行捕捉处理。比如NumberFormatException异常。
不能在ForkJoinTask类的compute()方法中抛出任务非运行时异常,因为这个方法的实现没有包含任何throws声明。因此,需要包含必需的代码来处理相关的异常。另一方面,compute()方法可以抛出运行时异常(它可以是任何方法或者方法内的对象抛出的异常)。ForkJoinTask类和ForkJoinPool类的行为与我们期待的可能不同。在控制台上,程序没有结束执行,不能看到任务异常信息。如果异常不被抛出,那么它只是简单地将异常吞噬掉。然而,我们能够利用ForkJoinTask类的一些方法来获知任务是否有异常抛出,以及抛出哪一种类型的异常。在本节,我们将学习如何获取这些异常信息。
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
按照接下来的步骤实现本节的范例。
1.创建名为Task的类,并继承RecursiveTask类,RecursiveTask类的泛型参数为Integer 类型。
public class Task extends RecursiveTask<Integer> {
2.声明一个名为array的私有int数组。用来模拟在这个范例中即将处理的数据数组。
private int array[];
3.声明两个分别名为start和end的私有int属性。这些属性将决定任务要处理的数组元素。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40557-15.html
不是6g
而且没有任何人来管理