finally语句块不会被执行的情况

本文探讨了并发程序中finally语句块在后台进程设置下的行为,指出当非后台线程结束时,后台线程将被立即关闭,导致finally语句块无法执行,提出使用非后台线程的Executor作为更友好的后台进程管理方式。

之前对finally的理解是不管是return、break和continue最后finally语句块总是会被执行,但是,最近在看书的过程中发现,有一种情况下,finally会被彻底抛弃和忽略的,这种情况就是在并发程序中,将finally语句块所在的线程(假设为threadFin)设置成后台进程,即threadFin.setDaemon(true);此外,调用后台线程的方法应该是非后台线程的形式,这样,当非后台线程终止结束时,这个方法所调用的后台线程就会被JVM立即关闭,后台线程中的方法将不会去执行finally语句。具体的代码示例如下:

package com.du.concurrent;

import java.util.concurrent.TimeUnit;

public class ADaemon implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try{
			System.out.print("Starting ADaemon");
			TimeUnit.MILLISECONDS.sleep(1);
		}catch(InterruptedException e){
			System.out.print("Exiting via InterruptedException");
		}finally{
			System.out.print("the finally really run?");
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ADaemon ad = new ADaemon();
		Thread thread = new Thread(ad);
		thread.setDaemon(true);	//如果注释掉这行,finally语句块将会执行
		thread.start();
	}
}
/*
 *output
 *
 *Starting ADaemon
 * */
 

显然,后台进程的关闭是因为main()函数的退出,

即非后台线程的结束而被强制执行的,

所以,这种方式对后台进程的管理是极其不友好的。

非后台的Executor通常是一种更好的方式,

因为Executor控制的所有任务可以被同时关闭(这属于下一个主题了)。

try-catch-finally语句块Java中用于异常处理的一种结构。它的执行流程如下: 1. **try块**:首先执行try块中的代码。如果try块中的代码没有抛出异常,则直接跳到finally执行。如果try块中的代码抛出了异常,则根据异常的类型进入相应的catch块。 2. **catch块**:如果try块中的代码抛出了异常,程序会进入catch块,匹配异常类型。如果找到匹配的catch块,则执行该catch块中的代码。如果catch块中的代码没有抛出新的异常,则继续执行finally块。如果catch块中的代码也抛出了异常,则新的异常会继续向上抛出。 3. **finally块**:无论try块中的代码是否抛出异常,finally中的代码总是会被执行finally块通常用于释放资源,如关闭文件、释放数据库连接等。即使在catch块中抛出了新的异常,finally块也会被执行。 以下是一个示例代码,展示了try-catch-finally执行流程: ```java try { // 可能会抛出异常的代码 int result = 10 / 0; // 这行代码会抛出ArithmeticException System.out.println("Result: " + result); } catch (ArithmeticException e) { // 捕获并处理异常 System.out.println("Caught an arithmetic exception: " + e.getMessage()); } finally { // 无论是否发生异常,这段代码都会执行 System.out.println("Executing finally block"); } ``` 在这个示例中,try块中的代码会抛出一个`ArithmeticException`,因此会进入catch块,执行相应的异常处理代码。最后,无论是否发生异常,finally中的代码都会被执行
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值