13 February 2010

Groovy way to see if thread execution had errors

I had to write a script that did something and for a faster run I decided to use threads.
I needed to start a thread to do some task and then to be able to check that it had finished without an error/exception.
In Java if the code executed in a new thread throws an error, it doesn't matter that much, it just executes the next instruction after thread.join().
Some solutions found on the internet were
  • to put all the code inside the thread in a try-catch block and in the catch block populate a map with the thread name and status. Then you could get the status by querying statusMap[threadName]
  • add a status status field to your class witch is a subclass of Thread. Then you do the same thing as above and in the catch block modify the status to failed (status is successfull in the begining). You get get the status by thread.status
Luckily in  groovy we have dynamic object behaviour.
So my solution is to add a new field to the Thread class, and use Thread.setDefaultUncaughtExceptionHandler to populate it.
It looks something like
Thread.metaClass.failed = false

Thread.setDefaultUncaughtExceptionHandler(
        {t, ex ->
          t.failed = true
        } as Thread.UncaughtExceptionHandler)

def th= Thread.start {
  println ' in thread 1'
  throw new RuntimeException("thread exception")
  println ' in thread 2'

}
th.join()

assert th.failed

And now I can see if any exception/error has been thrown. And all the threads I start will have this property.

1 comment:

  1. Cool hack, I did that in java by forcing the thread implementation class to implement a life cycle interface so that, if there's any error it'd give a callback to the interface.

    But this one's lot of more 'groovier', I liked it.. thanks for the post.

    ReplyDelete