JavaScript在工作线程中执行任务

时间:2019-12-02 10:12:19

标签: javascript

我最近正在学习javascript的异步编程,看来javascript没有像Java这样的“ thread-api”。
在android中,我们可以将慢速函数放到工作线程中以避免阻塞ui操作。
因此,如何通过javascript实现以下Java函数:

public void execAsync() {
        new Thread(){
            slowFunction();
        }.start();
}

3 个答案:

答案 0 :(得分:2)

您可以在Java语言中使用javascript的线程可能是 “网络工作者” 。(我将为您和对象+数组提供示例,而不仅仅是一个简单的字符串)

let thread = new Worker("worker.js");

他们通过消息进行交流

 thread.postMessage([first.value,second.value]);
 console.log('Message posted to worker');

在worker.js

onmessage = function(e) {
  console.log('Message received from main script');
  var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
  console.log('Posting message back to main script');
  postMessage(workerResult);
}

答案 1 :(得分:1)

JavaScript和Java具有完全不同的异步方法。 Java具有基于线程的并发性,而相同的代码可以跨不同的线程运行并在相同的内存上运行,而JS具有基于任务的并发性,而不同的 agents 可以彼此交换消息。

因此,您不能仅将基于线程的编码样式转换为基于任务的编码样式。

    Task based concurrency:                       Thread based concurrency:

 - time ->           ---- time -->           - time ->   - time ->   - time ->
 +-------+        +-------+ +-------+      +----------+  +----------+ +-----------+
 | Task  |        | task  | | task  |      | Thread   |  | Thread   | | Thread    |
 +-------+        +-----------------+      +--------------------------------------+
 | Agent |<-Msg ->| Agent           |      | Engine                               |
 | -Code |        | -Code           |      | -Code                                |
 | -Mem  |        | -Mem            |      | -Mem                                 |
 +----------------------------------+      +--------------------------------------+
 | Engine                           |
 +----------------------------------+

在大多数情况下,JavaScript中只要一个 agent 就足够了,因为您可以将大多数任务(计时器,IO)卸载到引擎上:

 setTimeout(function() { // Task 1: Register the timer
  // Task 2: Do stuff when the timer triggers
  console.log("test");
 }, 1000);

唯一的情况是您真的需要多个代理,如果您有无法卸载的工作,换句话说:繁重的计算。在这些情况下,您可以使用多个 agent (浏览器中的WorkerThreads / ServiceWorkers,NodeJS中的进程)。与Java线程不同,这些代理不共享代码和内存(SAB除外)。

要使另一个WebWorker在浏览器中运行,您必须启动一个指定要运行的另一个文件:

 const worker = new WebWorker("worker.js");

然后您可以send/receive messages between the agents

答案 2 :(得分:0)

JavaScript确实是单线程的。 https://developer.mozilla.org/en-US/docs/Web/javascript

您可以与服务人员一起获取线程,在此处查看更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API