Traditional programs have a single “thread of execution”: the statements or instructions that comprise the program are executed sequentially until the program terminates. A multithreaded program has more than one thread of execution. Within each thread, statements are executed sequentially, but the threads themselves may be executed in parallel—on a multicore CPU, for example. Often (on single-core, single-CPU machines, for instance), multiple threads are not actually executed in parallel, but parallelism is simulated by interleaving the execution of the threads.
Programs such as image processing software that perform a lot of calculations are said to be compute-bound. They can only benefit from multithreading if there are actually multiple CPUs to run computations in parallel. Most programs are not fully compute-bound, however. Many, such as web browsers, spend most of their time waiting for network or file I/O. Programs like these are said to be IO-bound. IO-bound programs can be usefully multithreaded even when there is only a single CPU available. A web browser might render an image in one thread while another thread is waiting for the next image to be downloaded from the network.
Ruby makes it easy to write multi-threaded programs with the
Thread class. To start a new thread,
just associate a block with a call to
Thread.new. A new thread will be created to execute the code in the
block, and the original thread will return from
Thread.new immediately and ...