1. A method for executing instructions on a multi-threaded processor having multiple hardware threads with differing hardware resources comprising the steps of: receiving a plurality of streams of instructions for execution on the multiple hardware threads; determining which hardware threads are able to receive instructions for execution; determining whether a thread determined to be available for executing an instruction has the hardware resources required by that instruction; and executing the instruction in dependence on the result of the determination.