Yao, this is what I found in the API Specification:
run() If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns.
But I think that A & C are the correct answers because in A you start the first thread, wait for it to finish and then you start the second one and wait for it to finish, so it will always have that behavior.
In B, you start the 2 threads and then wait for the first one to finish, so the 2 threads are running concurrently and you can't predict the behavior.
In C, when you try to run the threads with run() nothing happens, and when you try to join, then nothing happens because the threads are not running, so it is predictable again.
And in D, you try to join the threads that are not running so nothing happens and when you run them, again the behavior is unpredictable.