Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中访问僵尸线程堆栈?_Java_Multithreading_Concurrency - Fatal编程技术网

在java中访问僵尸线程堆栈?

在java中访问僵尸线程堆栈?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个类似的问题 让我们假设以下方法由线程(a)运行 假设有一个错误是不可捕获的,所以当我从java线程中得到时,我们可以使用setUncaughtExceptionHandler()方法添加一个未捕获的异常管理器,所以问题是,我如何访问我打开的文件(fis)从终止线程堆栈中,并从处理程序中关闭它?注意:代码在Java 7中工作+ 别这样!通常,打开流的方法也应该关闭它!将流放入try with resource子句中,它将自动关闭: void run() { //some work

我有一个类似的问题

让我们假设以下方法由线程(a)运行


假设有一个错误是不可捕获的,所以当我从java线程中得到时,我们可以使用
setUncaughtExceptionHandler()
方法添加一个未捕获的异常管理器,所以问题是,我如何访问我打开的文件(
fis
)从终止线程堆栈中,并从处理程序中关闭它?

注意:代码在Java 7中工作+

别这样!通常,打开流的方法也应该关闭它!将流放入try with resource子句中,它将自动关闭:

void run() {
    //some work
    try (FileInputStream fis=new FileInputStream(new File("/home/share/_config"))) {
        //some work with fis
    }
}
如果执行流离开
try
块,则流
fis
将关闭,原因可能是它完成了工作,也可能是由于异常


还可以使用分号(;)作为分隔符,在同一try-with-resource子句中打开多个输入流。有关详细信息,请参阅。

如果使用
finally
子句关闭
文件输入流
,则此处没有问题。Java 7中还有一种新语法,允许您在括号中指定需要关闭的内容,在
try
clauseNote中,
FileInputStream
声明为抛出选中的异常。要么您的代码编写良好并很好地清理了资源,要么它是一团乱麻,您无法修复。假装可以在边缘收拾一团乱麻会让糟糕的情况变得更糟。那么多个资源呢,它将有嵌套的
try(){}
块,它也工作吗?!一般来说,除了这个例子之外,我应该如何访问堆栈呢?不,在try子句中可以有多个资源,它们之间用分号(;)分隔。如果您在run方法内部打开流,并且没有在某个地方发布它,那么就不可能从外部访问它!(InputStream变量的作用域是方法,所以不可能!)因此,如果存在创建资源的条件,我不能在默认情况下初始化它们,条件太多,是否可以使用
try
声明变量并稍后初始化?否。初始化必须在try子句中进行。打开它之前,请检查条件。如果要打开多个资源,当然也可以嵌套try语句。
void run() {
    //some work
    try (FileInputStream fis=new FileInputStream(new File("/home/share/_config"))) {
        //some work with fis
    }
}