Monday 2 May 2016

Interrupting a Thread in java

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.

Interrupt the thread which is in sleeping or waiting state - Exception

class TestInterrupt extends Thread { 
       public void run() {
          try {
              System.out.println("Thread sleep for 1 sec");
              Thread.sleep(1000);
                    
          } catch(InterruptedException e) {
              throw new RuntimeException("Thread interrupted..."+e);
          }
       }

       public static void main(String args[]) {
           TestInterrupt test = new TestInterrupt();
           test.start();
           try {
              System.out.println("Call interrupt");
              test.interrupt();
           } catch(Exception e) {
              System.out.println("Exception handled "+e);
           }
       }
}

Output:
       Call interrupt
       Thread sleep for 1 sec
       Exception in thread "Thread-0" java.lang.RuntimeException:
       Thread interrupted...java.lang.InterruptedException: sleep interrupted
       at TestInterrupt.run(TestInterrupt.java:10)


If the thread is not in the sleeping or waiting state, calling the interrupt() method performs normal behavior and doesn't interrupt the thread but sets the interrupt flag to true.
Interrupt the thread which is not in sleeping or waiting state – No Exception

class TestInterrupt extends Thread { 
       public void run() {

              System.out.println("Inside the run method");
              int sum = 0;
              for(int i=0;i<2000;i++) {
                     sum = sum + i;
              }
              System.out.println(sum);
       }

       public static void main(String args[]) {
              TestInterrupt test = new TestInterrupt();
              test.start();
              try {
                     System.out.println("Call interrupt");
                     test.interrupt();
              } catch(Exception e) {
                     System.out.println("Exception handled "+e);
              }
       }
}

Output:
       Call interrupt
       Inside the run method
       1999000      

Interrupting a thread that start working

After interrupting the thread, the thread will keep working after handling the InterruptedException.

If we will propagate the exception, the thread will stop working.

class TestInterrupt extends Thread {
       public void run() {
              try {
                     System.out.println("Thread in sleep state");
                     Thread.sleep(1000);
                    
              } catch(InterruptedException e) {
                     // if we propagate the exception - thread will stop working
                     //throw new RuntimeException("Thread interrupted..." +e);
              }
              System.out.println("Thread is running after interrupting");
       }

       public static void main(String args[]) {
              TestInterrupt test = new TestInterrupt();
              test.start();
              try {
                     System.out.println("interrupting thread...");
                     test.interrupt();
              } catch(Exception e) {
                     System.out.println("Exception handled "+e);
              }
       }
}

Output:
      
       interrupting thread...
       Thread in sleep state
       Thread is running after interrupting

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...