aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Can interrupt() method is used to interrupt running thereads ... Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Can interrupt() method is used to interrupt running thereads ..." Watch "Can interrupt() method is used to interrupt running thereads ..." New topic
Author

Can interrupt() method is used to interrupt running thereads ...

Narasimha Rao B.
Ranch Hand

Joined: Aug 26, 2002
Posts: 205
Hi,
Can i use the interrupt() method to interrupt normal working threads or only for sleeping and waiting threads.
Please go through the below code,
----
public class D implements Runnable {
public void run(){
for (int i=0;i<100;i++){
System.out.println(i);
}
}
public static void main(String[] args) {
D d = new D();
Thread th = new Thread(d);
th.start();
th.interrupt(); // 1
}
}
---------
At // 1, i am interrupting the thread, 'th', but there is no effect.
Hi Friends,
Just now i found that one interesting thing. We all know the use of setPriority() method, which will be used to set the priority of the thread. You can pass the integer values or constants of the thread class(MIN_PRIORITY, MAX_PRIORITY). If you pass your own integer values it should be between 0 and 10, otherwise it will give IllegalArgumentException, even you can't pass 11.
That is interesting.
I hope many of you know this previously. Just i want to pass on others if some one not noted till now.( Bec till today i don't know)
Thanks in Advance,


Narasimha
Sekhar Kadiyala
Ranch Hand

Joined: Feb 17, 2004
Posts: 170
I guess such errors are OS/JVM specific. Usually it is between 1 and 10. However these values may change based on the JVM implemementation for a specific OS.
Some time the MAX_PRIORITY might come down or might go up.


PMP CSQA SCJP SCWCD SCBCD INS 21 INS 23
Corey McGlone
Ranch Hand

Joined: Dec 20, 2001
Posts: 3271
Originally posted by Narasimha Rao B.:
Can i use the interrupt() method to interrupt normal working threads or only for sleeping and waiting threads.
...
At // 1, i am interrupting the thread, 'th', but there is no effect.

Yes, you can interrupt a thread that is not already blocked in some way. However, how it responds to that interruption is a little different.
If you look at the API Spec for API Spec for Thread, you'll find this under the description of the interrupt method:

If none of the previous conditions hold then this thread's interrupt status will be set.

That's saying that, if the thread is not blocking for some reason and received an interruption, it will set a status (basically sets a boolean variable to true). It's now up to the thread to check to see if it has been interrupted or not. I modified your test program a little to look like this:

I pulled this excerpt from the output:

As you can see, the main thread is sending an interruption to the spawned thread and the spawned thread can react to that interruption by utilizing the interrupted() method defined within Thread.
Note that you can also use isInterrupted() to determine if the thread has received an interrupt (as opposed to interrupted). However, interrupted() will reset the interrupted status to false while isInterrupted will leave it unchanged. You can look at the full descriptions of both within the API Spec.
I hope that helps,
Corey


SCJP Tipline, etc.
Narasimha Rao B.
Ranch Hand

Joined: Aug 26, 2002
Posts: 205
Hi Corey,
Thanks for your reply.
Here is my understanding of the interrupt() method. (Please correct me, if i am wrong)
1. When you call interrupt() method on sleeping or waiting thread (sleeping or waiting)thread will throw the interrupted exception and will wakeup and will start working. And the boolean variable of the thread will be set to true.
2. When you call first time interrupt() method on normal working thread(say, going through big for loop), boolean variable(isInterrupted) will be set to true and will continue its usual execution. Note that, it will not stop execution because of calling the interrupt method. Any further calling interrupt method on the same thread will have not impact, because the boolean variable, is already true.
Is my understanding correct?
Please correct me, if i am wrong.

Thanks...
Corey McGlone
Ranch Hand

Joined: Dec 20, 2001
Posts: 3271
I think you need to re-read the API Spec.

1. When you call interrupt() method on sleeping or waiting thread (sleeping or waiting)thread will throw the interrupted exception and will wakeup and will start working. And the boolean variable of the thread will be set to true.

If you interrupt a blocked thread, that thread will throw an InterruptedException so that the interruption can be handled. At that point, the interrupted status is not set. It is only set if the thread that is interrupted is not blocked.

2. When you call first time interrupt() method on normal working thread(say, going through big for loop), boolean variable(isInterrupted) will be set to true and will continue its usual execution. Note that, it will not stop execution because of calling the interrupt method. Any further calling interrupt method on the same thread will have not impact, because the boolean variable, is already true.

Be sure you don't confuse the interrupted status of a thread with the isInterrupted method.
If you invoke interrupt() on a thread that is not blocked, it's interrupted status will be set to true. It is then up to that thread to do something about that interruption - you can't force it to do something. Invoking interrupt on that thread will not have any further impact as the interrupt status is already set to true at this point. However, if that thread does handle the interruption by invoking its interrupted method (which resets the interrupted status to false), you can reset the status to true by again invoking interrupt on that thread.
I hope that helps,
Corey
Narasimha Rao B.
Ranch Hand

Joined: Aug 26, 2002
Posts: 205
Hi Corey,
Thanks a lot for such a nice reply. It really helps.

Thanks.
 
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
 
subject: Can interrupt() method is used to interrupt running thereads ...