The cancel event/flag should be a volatile
... I asked a very similar question to yours: http://stackoverflow.com/questions/2474945/is-it-safe-to-use-a-boolean-flag-to-stop-a-thread-from-running-in-c
I would also recommend that when you cancel your threads you wait for all of them to cancel by using something similar to the C# version of CountDownLatch. It's useful when you want to guarantee that the thread is canceled.