Tuesday, 31 March 2015

Interrupting a thread in Java


Interrupting a Thread:

If any thread is in sleeping or waiting state (i.e. sleep() or wait() is invoked), calling the interrupt() method on the thread, breaks out the sleeping or waiting state throwing InterruptedException. If the thread is not in the sleeping or waiting state, calling the interrupt() method performs normal behaviour and doesn't interrupt the thread but sets the interrupt flag to true. Let's first see the methods provided by the Thread class for thread interruption.

The 3 methods provided by the Thread class for interrupting a thread

·         public void interrupt()
·         public static boolean interrupted()
·         public boolean isInterrupted()

Example of interrupting a thread that stops working

In this example, after interrupting the thread, we are propagating it, so it will stop working. If we don't want to stop the thread, we can handle it where sleep() or wait() method is invoked. Let's first see the example where we are propagating the exception.
1.    class TestInterruptingThread1 extends Thread{  
2.    public void run(){  
3.    try{  
4.    Thread.sleep(1000);  
5.    System.out.println("task");  
6.    }catch(InterruptedException e){  
7.    throw new RuntimeException("Thread interrupted..."+e);  
8.    }  
9.      
10. }  
11.   
12. public static void main(String args[]){  
13. TestInterruptingThread1 t1=new TestInterruptingThread1();  
14. t1.start();  
15. try{  
16. t1.interrupt();  
17. }catch(Exception e){System.out.println("Exception handled "+e);}  
18.   
19. }  
20. }  
Output:Exception in thread-0  
       java.lang.RuntimeException: Thread interrupted...
       java.lang.InterruptedException: sleep interrupted
       at A.run(A.java:7)

Example of interrupting a thread that doesn't stop working

In this example, after interrupting the thread, we handle the exception, so it will break out the sleeping but will not stop working.
1.    class TestInterruptingThread2 extends Thread{  
2.    public void run(){  
3.    try{  
4.    Thread.sleep(1000);  
5.    System.out.println("task");  
6.    }catch(InterruptedException e){  
7.    System.out.println("Exception handled "+e);  
8.    }  
9.    System.out.println("thread is running...");  
10. }  
11.   
12. public static void main(String args[]){  
13. TestInterruptingThread2 t1=new TestInterruptingThread2();  
14. t1.start();  
15.   
16. t1.interrupt();  
17.   
18. }  
19. }  


Output:Exception handled  
       java.lang.InterruptedException: sleep interrupted
       thread is running...

Example of interrupting thread that behaves normally

If thread is not in sleeping or waiting state, calling the interrupt() method sets the interrupted flag to true that can be used to stop the thread by the java programmer later.
1.    class TestInterruptingThread3 extends Thread{  
2.      
3.    public void run(){  
4.    for(int i=1;i<=5;i++)  
5.    System.out.println(i);  
6.    }  
7.      
8.    public static void main(String args[]){  
9.    TestInterruptingThread3 t1=new TestInterruptingThread3();  
10. t1.start();  
11.   
12. t1.interrupt();  
13.   
14. }  
15. }  

Output:1
       2
       3
       4 
       5

What about isInterrupted and interrupted method?

The isInterrupted() method returns the interrupted flag either true or false. The static interrupted() method returns the interrupted flag afterthat it sets the flag to false if it is true.
1.    public class TestInterruptingThread4 extends Thread{  
2.      
3.    public void run(){  
4.    for(int i=1;i<=2;i++){  
5.    if(Thread.interrupted()){  
6.    System.out.println("code for interrupted thread");  
7.    }  
8.    else{  
9.    System.out.println("code for normal thread");  
10. }  
11.   
12. }//end of for loop  
13. }  
14.   
15. public static void main(String args[]){  
16.   
17. TestInterruptingThread4 t1=new TestInterruptingThread4();  
18. TestInterruptingThread4 t2=new TestInterruptingThread4();  
19.   
20. t1.start();  
21. t1.interrupt();  
22.   
23. t2.start();  
24.   
25. }  
26. }  

Output:Code for interrupted thread
       code for normal thread
       code for normal thread
       code for normal thread
       

Reentrant Monitor in Java

According to Sun Microsystems, Java monitors are reentrant means java thread can reuse the same monitor for different synchronized methods if method is called from the method.

Advantage of Reentrant Monitor

It eliminates the possibility of single thread deadlocking

Let's understand the java reentrant monitor by the example given below:
1.    class Reentrant {  
2.        public synchronized void m() {  
3.        n();  
4.        System.out.println("this is m() method");  
5.        }  
6.        public synchronized void n() {  
7.        System.out.println("this is n() method");  
8.        }  
9.    }  
In this class, m and n are the synchronized methods. The m() method internally calls the n() method.
Now let's call the m() method on a thread. In the class given below, we are creating thread using annonymous class.
1.    public class ReentrantExample{  
2.    public static void main(String args[]){  
3.    final Reentrant re=new Reentrant();  
4.      
5.    Thread t1=new Thread(){  
6.    public void run(){  
7.    re.m();//calling method of Reentrant class  
8.    }  
9.    };  
10. t1.start();  
11. }}  

Output: this is n() method

this is m() method

No comments:

Post a Comment

Access attributes in component

NOTE: To access an attribute in a  component , use expressions as  {! v.<Attribute Name>} . ----------------------------------------...