How can I wake a thread that is blocked on a call to InputStream.read()?
You can't. That's the way it's supposed to work.
One workaround is to use a non-blocking input stream. Such a stream would call in.available() to check for the number of bytes that can currently be read without blocking. If the number is zero, or is less than the size of the data you're expecting, then you can go on with your business in the rest of the program. One disadvantage to this technique is that you must poll for input; one big advantage to the standard block-on-read threads is that they process data as soon as it is availalble.
See the new (Java 1.4) java.nio.channels package for non-blocking I/O support.