我最近正在学习javascript的异步编程,看来javascript没有像Java这样的“ thread-api”。
在android中,我们可以将慢速函数放到工作线程中以避免阻塞ui操作。
因此,如何通过javascript实现以下Java函数:
public void execAsync() {
new Thread(){
slowFunction();
}.start();
}
答案 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");
答案 2 :(得分:0)
JavaScript确实是单线程的。 https://developer.mozilla.org/en-US/docs/Web/javascript
您可以与服务人员一起获取线程,在此处查看更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API