Is there any other clean way of doing this? No. Stick with the (volatile) boolean.
I'm sure Thread.stop() would work, but there's no opportunity to clean up properly. Using interrupted()/isInterrupted() will work, but it's a bit more complicated than the boolean. Plus, there are times when you don't want to quit a loop just because it was interrupted. I've got code in a few places where I recover from an InterruptedException (or something similar), then check my boolean (or whatever) and, depending on its value, continue or not.
The boolean plays well with others. I've mentioned the interrupt. You might someday have 20 different reasons to stop the loop in any of 10 (or more) places. That boolean will fit right in; you can easily write code so that your thread always stops when the boolean is true, or never stops when its false, or whatever else you need done.