None of the above, but:
Thread t = new Thread(new X());
The caveat is that the process will end once the main ends, it will only wait for daemon threads. If the thread is not a daemon, run may be terminated in the middle.
Indeed 3) is the closest good answer, but it is wrong.
* is syntactically incorrect, because X has to be an instance of a Runnable, not a class. Also, the thread is not started.
* is the same as 1), except the thread now starts.
4) Fails to initialize the thread with a runnable (which is allowed, but it won't execute the provided run function). If the thread would be properly constructed, it will yield the desired functionality, however not in a multi-threaded fashion, since calling run directly is legal.