Чтобы основной поток был занят в течение нескольких миллисекунд:
function wait(ms) {
const start = performance.now();
while(performance.now() - start < ms);
}
Вики-страница всегда является хорошим местом для начала, поскольку она полностью объясняет алгоритм и предоставляет комментированный псевдокод. (NB Здесь много деталей, и, поскольку вики-сайт надежно работает, я не буду его здесь цитировать.)
Для ссылок на конкретных языках, которые вы упомянули:
Надеюсь, что это поможет.