Anything which can be done asynchronously (at the same time, independent of each other) can benefit from multi-threading.
In your example, this isn't the case (I'm assuming you want the numbers printed out in order) because all the numbers in HelloRunnable have to be printed out before you want the numbers in HelloRunnable2 to be printed out, which is a synchronous operation(HelloRunnable2 must wait for HelloRunnable to finish to get the correct results).
There are many examples of things which can be run asynchronously. Generally, they fall into these two broad categories:
1. You're looking to speed up something which is computationally expensive and can be split up into asynchronous tasks, either partly or in whole. Note that you'll only get any appreciable speed-up if you actually have multiple cores on your computer.
2. You're looking to improve the response of different asynchronous components (such as a GUI interface which can still receive user input while data processing happens on another thread to prevent either side from hanging). This can be beneficial on single core systems as well as multi core systems because the OS can switch between the tasks automatically for you, therefore if you're computation takes a long time, some CPU clocks are still being diverted to your GUI control allowing the user to still use it at the same time.