If you are using java 5 then you can use callable If not, then write an abstract class that exposes a new abstract method that implementations must override to do the *required* job. (This will contain code that otherwise would have been in run())This class implements Runnable and implements the run() method. In the run method call the abstract method. If it throws an exception then store it and give a getter for this exception. You also have to provide a method to enquire whether the task has finished or not! Hope this helps.