CPU-Bound vs IO-Bound: Understanding the Differences in Multithreaded Programming