One way to look at it is that normally your code has a linear flow to it- one line executes, and then the next line executes. It always goes in order. It may branch, but the branches are determined deterministically by comparisons.
Now when you add a thread, there are two independent threads of execution which interact. A single line of code can execute, then the thread can switch, and this same line of code can execute again!