Interruptedexception java что это
Перейти к содержимому

Interruptedexception java что это

Handling InterruptedException in Java

What is the difference between the following ways of handling InterruptedException ? What is the best way to do it?

EDIT: I’d like to also know in which scenarios are these two used.

7 Answers 7

What is the difference between the following ways of handling InterruptedException? What is the best way to do it?

You’ve probably come to ask this question because you’ve called a method that throws InterruptedException .

First of all, you should see throws InterruptedException for what it is: A part of the method signature and a possible outcome of calling the method you’re calling. So start by embracing the fact that an InterruptedException is a perfectly valid result of the method call.

Now, if the method you’re calling throws such exception, what should your method do? You can figure out the answer by thinking about the following:

Does it make sense for the method you are implementing to throw an InterruptedException ? Put differently, is an InterruptedException a sensible outcome when calling your method?

If yes, then throws InterruptedException should be part of your method signature, and you should let the exception propagate (i.e. don’t catch it at all).

Example: Your method waits for a value from the network to finish the computation and return a result. If the blocking network call throws an InterruptedException your method can not finish computation in a normal way. You let the InterruptedException propagate.

If no, then you should not declare your method with throws InterruptedException and you should (must!) catch the exception. Now two things are important to keep in mind in this situation:

Someone interrupted your thread. That someone is probably eager to cancel the operation, terminate the program gracefully, or whatever. You should be polite to that someone and return from your method without further ado.

Even though your method can manage to produce a sensible return value in case of an InterruptedException the fact that the thread has been interrupted may still be of importance. In particular, the code that calls your method may be interested in whether an interruption occurred during execution of your method. You should therefore log the fact an interruption took place by setting the interrupted flag: Thread.currentThread().interrupt()

Example: The user has asked to print a sum of two values. Printing » Failed to compute sum » is acceptable if the sum can’t be computed (and much better than letting the program crash with a stack trace due to an InterruptedException ). In other words, it does not make sense to declare this method with throws InterruptedException .

By now it should be clear that just doing throw new RuntimeException(e) is a bad idea. It isn’t very polite to the caller. You could invent a new runtime exception but the root cause (someone wants the thread to stop execution) might get lost.

Other examples:

Implementing Runnable : As you may have discovered, the signature of Runnable.run does not allow for rethrowing InterruptedExceptions . Well, you signed up on implementing Runnable , which means that you signed up to deal with possible InterruptedExceptions . Either choose a different interface, such as Callable , or follow the second approach above.

Calling Thread.sleep : You’re attempting to read a file and the spec says you should try 10 times with 1 second in between. You call Thread.sleep(1000) . So, you need to deal with InterruptedException . For a method such as tryToReadFile it makes perfect sense to say, «If I’m interrupted, I can’t complete my action of trying to read the file». In other words, it makes perfect sense for the method to throw InterruptedExceptions .

This post has been rewritten as an article here.

user avatar

As it happens I was just reading about this this morning on my way to work in Java Concurrency In Practice by Brian Goetz. Basically he says you should do one of three things

Propagate the InterruptedException — Declare your method to throw the checked InterruptedException so that your caller has to deal with it.

Restore the Interrupt — Sometimes you cannot throw InterruptedException . In these cases you should catch the InterruptedException and restore the interrupt status by calling the interrupt() method on the currentThread so the code higher up the call stack can see that an interrupt was issued, and quickly return from the method. Note: this is only applicable when your method has «try» or «best effort» semantics, i. e. nothing critical would happen if the method doesn’t accomplish its goal. For example, log() or sendMetric() may be such method, or boolean tryTransferMoney() , but not void transferMoney() . See here for more details.

user avatar

What are you trying to do?

The InterruptedException is thrown when a thread is waiting or sleeping and another thread interrupts it using the interrupt method in class Thread . So if you catch this exception, it means that the thread has been interrupted. Usually there is no point in calling Thread.currentThread().interrupt(); again, unless you want to check the «interrupted» status of the thread from somewhere else.

Regarding your other option of throwing a RuntimeException , it does not seem a very wise thing to do (who will catch this? how will it be handled?) but it is difficult to tell more without additional information.

The correct default choice is add InterruptedException to your throws list. An Interrupt indicates that another thread wishes your thread to end. The reason for this request is not made evident and is entirely contextual, so if you don’t have any additional knowledge you should assume it’s just a friendly shutdown, and anything that avoids that shutdown is a non-friendly response.

Java will not randomly throw InterruptedException’s, all advice will not affect your application but I have run into a case where developer’s following the «swallow» strategy became very inconvenient. A team had developed a large set of tests and used Thread.Sleep a lot. Now we started to run the tests in our CI server, and sometimes due to defects in the code would get stuck into permanent waits. To make the situation worse, when attempting to cancel the CI job it never closed because the Thread.Interrupt that was intended to abort the test did not abort the job. We had to login to the box and manually kill the processes.

So long story short, if you simply throw the InterruptedException you are matching the default intent that your thread should end. If you can’t add InterruptedException to your throw list, I’d wrap it in a RuntimeException.

There is a very rational argument to be made that InterruptedException should be a RuntimeException itself, since that would encourage a better «default» handling. It’s not a RuntimeException only because the designers stuck to a categorical rule that a RuntimeException should represent an error in your code. Since an InterruptedException does not arise directly from an error in your code, it’s not. But the reality is that often an InterruptedException arises because there is an error in your code, (i.e. endless loop, dead-lock), and the Interrupt is some other thread’s method for dealing with that error.

If you know there is rational cleanup to be done, then do it. If you know a deeper cause for the Interrupt, you can take on more comprehensive handling.

Interruptedexception java что это

Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2022, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.

Interruptedexception java что это

Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2022, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *