java - Java 多线程、Linux 进程和 HTML5 Webworker 之间有什么区别? Webworkers的实际例子和用途是什么?

标签 java javascript multithreading performance web-worker

我是 HTML5 Webworker API 的新手。 网络 worker 是在后台运行的 JavaScript,不会影响页面的性能

下面给出了 Webworker API 的简单示例。 如果我启动 Webworker 并且不停止使用其他页面和站点。几分钟后,我的浏览器将有更多的负载和使用浏览器的问题。 它在后台运行,但如果我们不停止 Webworker,它们会增加并影响性能问题,因此,我如何声明“不影响页面性能”

任何人都可以给出适当的示例或建议以供实际使用吗?我们可以将 webworker 与 Java 多线程和 Linux 进程进行比较吗?

demo.html

<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button> 
<button onclick="stopWorker()">Stop Worker</button>
<script>
    var w;

    function startWorker() {
        if(typeof(Worker)!=="undefined") {
            if(typeof(w)=="undefined") {
                w=new Worker("demo_workers.js");
            }
            w.onmessage = function (event) {
                document.getElementById("result").innerHTML=event.data;
            };
        } else {
            document.getElementById("result").innerHTML="Sorry, your browser does not support Web Workers...";
        }
    }

    function stopWorker() { 
        w.terminate();
    }
</script>
</body>
</html>

demo_workers.js

var i=0;

function timedCount() {
    i=i+1;
    postMessage(i);
    setTimeout("timedCount()",500);
}

timedCount();

最佳答案

网络 worker 不会中断 UI 线程

javascript 中的 Webworker 使我们能够生成新线程。在大多数浏览器实现中,javascript 是单线程的。它与负责重排和重绘页面的 UI 线程共享执行时间。如果您执行通常需要很长时间才能处理的 javascript,您很容易使您的页面无响应,因为它会忙于执行您告诉它要做的任何事情,而不是处理用户事件和重新绘制页面。我们可以通过多种方式解决这个问题(setTimeout 或工作队列),但如果您正在尝试计算正确的数据类型,我们也可以使用网络 worker 。

因此,是的,产生更多线程会增加计算机的负载,但同时在 webworker 中完成的工作不会中断负责呈现页面的 UI 线程。

Webworker 限制

网络 worker 确实会产生真正的操作系统级线程,而且我们知道网络开发人员不能被信任来正确处理这个问题,所以 API 已经被冒泡包装所以我们不得不非常努力地伤害自己。

考虑到这一点:

  • 网络 worker 无权访问 DOM
  • 他们只能通过消息传递进行交流

这限制了它们的用途,因为您无法在另一个线程中计算 DOM 片段,并且您正在为您来回发送的所有数据添加序列化开销。所以你最好研究一个embarrassingly parallel问题,或者可能不值得付出努力。

使用其他语言,如 Java、C 和其他语言 concurrency specific languages通常可以让您更好地控制线程。大多数主流语言使用 shared memory model ,您可以在其中共享内存并通过互斥锁、屏障和其他机制控制其访问。当然,如果您不小心,也很容易陷入麻烦,因为死锁和其他并发错误更难调试。

一些令人尴尬的并行问题的例子?

一个令人尴尬的并行问题是可以很容易地拆分成不需要太多沟通的独立工作。

例如:

  • > Raytracer (您可以在不知道其他像素值的情况下计算每个像素)
  • 矩阵乘法
  • 暴力搜索

关于java - Java 多线程、Linux 进程和 HTML5 Webworker 之间有什么区别? Webworkers的实际例子和用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117790/

相关文章:

java - 时区更改会影响 SSL 握手吗?

javascript - 如何在 jQuery 中仅显示一次警报

python - 自定义Python线程池同步

java - 我需要一个 SQL 查询来找到你可以用一组字母组成的所有单词,包括最多两个空白 block

java - 区域设置和多语言支持的最佳实践是什么?

javascript - 如何在 JSP/Struts WEB-INF 中获取资源

javascript - 使用 Joomla 及其 Mootools 的 Twitter Bootstrap Carousel

java - 如何防止调度程序中调用异步函数的竞争条件?

java - 执行者没有运行所有线程。

java - JPA/Eclipselink 使用条件对所有列值求和