当前位置:首页 > JavaScript

js实现阻塞

2026-03-01 01:05:33JavaScript

同步阻塞

使用同步代码会阻塞JavaScript的执行,直到当前任务完成。由于JavaScript是单线程的,同步操作会阻止其他代码执行。

function syncBlock() {
    const start = Date.now();
    while (Date.now() - start < 3000) {} // 阻塞3秒
    console.log("同步阻塞完成");
}
syncBlock();
console.log("后续代码被阻塞");

循环阻塞

通过循环占用主线程实现阻塞。这种方式会持续占用CPU资源,导致页面无响应。

function loopBlock(duration) {
    const end = Date.now() + duration;
    while (Date.now() < end) {}
    console.log(`阻塞${duration}毫秒完成`);
}
loopBlock(2000);

定时器阻塞

虽然setTimeout本身是异步的,但可以通过递归调用实现类似阻塞的效果。这种方式比纯循环更友好。

function timerBlock(ms) {
    const start = Date.now();
    function check() {
        if (Date.now() - start < ms) {
            setTimeout(check, 0);
        } else {
            console.log("定时器阻塞完成");
        }
    }
    check();
}
timerBlock(3000);

Web Worker阻塞

在主线程中创建Worker并等待其完成。这种方式不会阻塞UI线程,但会阻塞主线程的执行流。

function workerBlock() {
    const worker = new Worker(URL.createObjectURL(
        new Blob([`postMessage('done');`], {type: 'application/javascript'})
    ));
    worker.onmessage = () => console.log("Worker完成");
    while(true) {} // 故意阻塞主线程
}

Atomics等待

使用SharedArrayBuffer和Atomics API可以实现真正的线程同步阻塞。

js实现阻塞

const sharedBuffer = new SharedArrayBuffer(4);
const sharedArray = new Int32Array(sharedBuffer);

function atomicsBlock() {
    Atomics.wait(sharedArray, 0, 0); // 无限等待
    console.log("Atomics等待结束");
}

注意事项

JavaScript是单线程语言,阻塞主线程会导致页面失去响应。大多数情况下应该避免阻塞操作,改用异步编程模式。Web Worker是处理耗时任务的最佳选择,它不会影响主线程的执行。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…