  Co-operative and pre-emptive scheduling are usually considered to be
complementary models of threading. In the case of virtual machines, we show
that they can be unified using a single concept, the bounded execution of a
thread of control, essentially providing a first-class representation of a
computation as it is reduced. Furthermore this technique can be used to surface
the thread scheduler of a language into the language itself, allowing programs
to provide their own schedulers without any additional support in the virtual
machine, and allowing the same virtual machine to support different thread
models simultaneously and without re-compilation.
