This is not on the IB Computer Science syllabus, but it’s useful for IAs and Grade 10 projects. One of the key reasons you might decide to run some code in its own thread is so that your GUI can remain responsive to user-generated events like button clicks. Imagine you have a sudoku game that displays a timer. You would need to run the timer in its own thread so that the game remained responsive to the user entering answers in the sudoku grid.
public class MultiThreadingExample { public static void main(String[] args) { /* Create five new tasks and set them running in their * own threads. */ for (int i = 0; i < 5; i++) { /* Notice that because we don't re-use the task * or thread objects, there is no need to assign * them to variables. This code is equivalent to * * Task task = new Task(); * Thread thread = new Thread(task); * thread.start() */ (new Thread(new Task())).start(); } } } class Task implements Runnable { private static int nextId; private int id; public Task() { init(); } private synchronized void init() { /* The synchronized keyword ensures that any thread * that runs this method runs the whole method before * yielding to another thread. This is necessary here * to prevent two threads from executing id = nextId * consecutively (in which case they will both get the * same id). */ id = nextId; nextId = nextId + 1; } public void run() { /* Each thread just counts up to 10 and prints out its * id and the number it has reached. */ for(int i = 0; i < 10; i++) { System.out.println(id + ": " + i); } } }