Keep execution resources busy by switching among hardware threads. Compare fine-grained, coarse-grained, and simultaneous multithreading, including their effects on latency, throughput, and shared resources.