As far as I understand, the receive[1] call performs pattern matching on messages in the queue. If no match is found, the call blocks until any of the patterns match. If a match is found, the first match is returned.
Since you perform this pattern matching, this means that messages may not be processed in the order they were received.