Java Threads and Exception Handling

 

Exception handling with threads seems to be a topic that can be confusing for people. So here I offer an example of how it can be done.

The “Callable” interface is provided exactly for this purpose. The code below creates a thread once without throwing an exception and creates a thread a second time in order to throw an exception. There isn’t much to it really, once you see it done, but getting there can be difficult.


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class Main {

 public static void main(String args[]) {
     // create an executor service to execute our threads (tasks)
     ExecutorService executor = Executors.newCachedThreadPool();

     // create a new thread/task
     FutureTask task = new FutureTask(new SomeThread(false));
     executor.submit(task); // execute the thread
     // we must shutdown the executor service in order to know when all
     // submitted tasks have completed..
     executor.shutdown();

     try {
         // wait a maximum of 5 seconds for the thread to terminate
         // (normally or with an error).
         executor.awaitTermination(5, TimeUnit.SECONDS);
         // output whatever value the thread returned.
         System.out.println("The task returned: " + task.get());
     } catch (InterruptedException e) {
         e.printStackTrace();
     } catch (ExecutionException e) {
         e.printStackTrace();
     }

     executor = Executors.newCachedThreadPool();
     task = new FutureTask(new SomeThread(true));
     executor.submit(task);

     executor.shutdown();
     try {
         executor.awaitTermination(5, TimeUnit.SECONDS);
         // The error is returned when we call the .get() method.
         System.out.println("The task returned: " + task.get());
     } catch (InterruptedException e) {
         e.printStackTrace();
     } catch (ExecutionException e) {
         e.printStackTrace();
     }
 } // end of main.

 static class SomeThread implements Callable {
     boolean throwAnError = false;

     public SomeThread(boolean throwAnError) {
         this.throwAnError = throwAnError;
     }

     public String call() throws Exception {
         System.out.println("Sleeping...");
         Thread.sleep(2000);
         System.out.println("Done sleeping!");

         if (throwAnError) {
             throw new Exception("Oh no, an exception!");
         }

         return "some return value";
     }
 } // end of SomeThread.
}

Of course there are some intricacies, but this should get anyone started. If this gets you excited the next exciting thing may be a BlockingQueue.

 Posted by at 8:03 pm

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)