Java process inputstream in thread-Collection of common programming errors
Take a look the excellent article When Runtime.exec() won’t from JavaWorld and see if it helps. In particular, this is probably your culprit:
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
The article provides various ways to address this problem, including the source code for a StreamGobbler class that consumes stderr and stdout in background threads.
It’s amazing how well this article has held up. It was originally written in 2000 and I find just about all of it to still be accurate.