java并发编程实战第五章(4)在任务中抛出异常

2024-05-16 09:18

本文主要是介绍java并发编程实战第五章(4)在任务中抛出异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4、在任务中抛出异常
1.非运行时异常:必须在方法上通过throws子句抛出,或者在方法体内通过try,catch方式进行捕捉处理,比如IOException或者
ClassNotFounException异常。
2.运行时异常:z这些异常不需要在方法上通过throws处理,也不需要try,catch处理。
说明:不能再ForkJoin类中的compute()方法中抛出任务非运行时异常,因为这个方法的实现没有包含任何throws声明,因此,需要
包含必须的代码处理相关的异常。另一方面,compute方法可以抛出运行时异常(可以是任何方法或者方法内的对象抛出的异常)。
ForkJoinTask类和ForkJoinPool类的行为与我们期待的可能不同。在控制台上,程序没有结束执行,不能看到任务异常信息,如果异常不能被抛出,那么它只是简单
地将任务吞噬掉,然而我们能够利用ForkJoinTask类的一些方法来获知任务是否有异常抛出,以及抛出的是哪种类型的异常。
在本程序中,虽然运行该程序会抛出异常,但是程序不会停止。在Main方法中,调用原始任务ForkJoinTask类的isCompletedAbnormally()方法,如果主任务或者
它的子任务之一抛出了异常,这个方法将返回true,也可以使用getException()方法来获得抛出的Exception对象。

当任务抛出运行时异常时,会影响它的父任务(发送到ForkJoinPool类的任务),以及父任务的父任务,依次类推。
我们需要记住的是在用ForkJoinPool对象,和ForkJoinTask对象开发一个程序时,它们是会抛出异常的,如果不想要这种行为,就得采用其他的方式。

public class Task  extends RecursiveTask<Integer>{private int array [];private int start , end;public Task(int[] array, int start, int end) {super();this.array = array;this.start = start;this.end = end;}@Overrideprotected Integer compute() {System.out.printf("Task : Start from %d to %d\n",start,end);if(end - start<10){if((3>start) && (3<end)){throw new RuntimeException("This task throws an Exception : Task from "+start+"to "+end);}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}else{int mid = (end+start) / 2;Task task = new Task(array,start,mid);Task task2 = new Task(array,mid,end);invokeAll(task,task2);}System.out.printf("Task : End form %d to %d\n",start,end);return 0;}
}
public class Main {public static void main(String[] args) {int array [] = new int [100];Task task = new Task(array,0,100);ForkJoinPool pool = new ForkJoinPool();pool.execute(task);pool.shutdown();try {pool.awaitTermination(1, TimeUnit.DAYS);} catch (InterruptedException e) {e.printStackTrace();}if(task.isCompletedAbnormally()){System.out.println("Main: An exception has ocurred\n");System.out.printf("Main: %s\n",task.join());}}
}

这篇关于java并发编程实战第五章(4)在任务中抛出异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994494

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr