In our example we'll use two threads:
| Thread | Priority |
|---|---|
| A | High |
| B | Low |
Now we'll watch them run, assuming both start at the same time:
| Time | Thread | Action | Explanation |
|---|---|---|---|
| t1 | A | Create | Thread is created. |
| t2 | A | Block | The thread is waiting for, say, I/O; it can't continue without it. |
| t3 | B | Create | Rather than sit idle, the kernel runs next highest priority thread. |
| t4 | B | Kernel Call | Thread B is working. |
| t4.5 | N/A | N/A | I/O completed; Thread A is ready to run. |
| t5 | B | Block | Thread A is now ready to run—it preempts thread B. |
| t6 | A | Run | Thread A resumes. |
| t7 | A | Dies | Its task complete, the thread terminates. |
| t8 | B | Runs | Thread B continues from where it left off. |
| t9 | ... | ... | ... |