请教 java的多线程 与 node.js的多事件 应该如何理解
发布于 11 天前 作者 maosiyu 480 次浏览 来自 问答

问题引发是 java的多线程 与 node.js的多事件 区别 应该如何理解

线程 和 事件 是什么关系? 事件 是什么? 多线程 和 多事件 的区别是什么? cpu 如何处理多线程? cpu 如何处理单线程多事件?

如偶遇大神还请 从 进程 线程 事件的由来的角度 讲解一下 不胜感激!

10 回复

留坑,周末整理一波看看我能不能说清楚🤣

@cctv1005s 先重重的感谢一下, 我学到这块儿有一点自己的理解, 就是所有的语法糖 都是对 硬件cpu多核 带来的问题, 作出了自己的一套解决方案,比如java的多线程的类 jvm对这些问题的控制; 相对 node.js 也有他自己的解决方案多事件; 不知道我理解的对不对。 期待大神的指点!

线程会创建一个执行环境,但是会共享进程内的资源,线程由于共享资源内存,所以不存在通信问题。 进程间相互独立,跟独立的 app 一样,通过类似于 rpc 的方式通信,很多种,信号量,内存之类的。这涉及到并发编程。

事件就是一个 while 不停的检测队列里面是否有函数需要执行。这就是异步编程,函数式编程 csp。

cpu 跟核心数有关吧,一个核心就像一个单独的个体,能做一件事,所以在相同参数下,为啥cpu 核越多越牛逼。 单个 cpu 一次还是只能做一件事,只是切换有些快,对你来说,你感觉不到。

浅显理解,这方面还是了解的少,用的少,看了忘。

@MiYogurt 感谢你的回答, 事件就是一个 while 不停的检测队列里面是否有函数需要执行。 这一句我还是不理解, 我能理解 一个进程内部为了实现并发而创造了线程,那么是不是可以也可以理解为 一个线程内为了实现并发,人类又创造了事件? 如果是那么java 为什么没这么做? 如果我想错了,那到底应该 怎么理解呢,最好是在通俗一点儿,大白话也好。感谢

@maosiyu 一个线程内为了实现并发,人类又创造了事件?各个事件之间不是因该也是同步执行的么?个人理解为事件有一个注册跟触发的过程,无论是注册还是触发的过程应该都是同步执行的吧。 个人感觉,事件只不过是把触发条件跟函数两者结合起来了,在特定的时间执行函数,跟并发没有任何联系。至于并发,java是通过多线程,node通过cluster开启多个进程来更好的利用cpu。 (个人感觉,有问题欢迎指出)

@MiYogurt 一个核心同时只能处理一件事不太对,比如英特尔大多处理器支持超线程,可以同时让两个线程用一个核的不同部分。

(不严格地)一个进程包含数个线程,线程间共享资源,操作系统会以线程为单位,把它们平衡到不同cpu核心上。node也可以用多线程来充分利用cpu的,不一定是多进程。 应该要理解成,事件这个概念,是上升到JS引擎才出现的,更底层不存在JS的所谓事件。 一般JS引擎会依照规范,建立事件循环。 以node和V8为例,node建立一个进程,包含多个线程,其中一个跑着你的JS代码,其他负责编译优化,IO等。 然后跑着js的线程中,主要有一个循环,有主要的两个事件队列,一个叫marco,一个叫micro,这个循环就是始终执行这两个队列,直到清空。 比如setTimeout就是在给定时间之后,将事件放入marco队列,Promise.resolve().then是将事件放入micro队列,而你的总的js代码,是放入marco队列,第一个执行的。更多请谷歌。

@xyzingh 是有多线程,不过我说的进程。没有再细分。

vvvv我饿

来自酷炫的 CNodeMD

事件 是什么?

事件往往指的是一种执行模型

多线程 和 多事件 的区别是什么?
cpu 如何处理多线程?

线程是操作系统层的概念,不同的操作系统,线程的实现方式可能不同,内核级别的多线程,基本上就是像"进程"一样单独调度,用户级的多线程实现,同一进程下的不同线程,可能会因为其中一个线程的同步操作而阻塞整个进程,也就是所有线程

cpu 如何处理单线程多事件?

取决于这里多事件的实现,单个线程想要实现事件模型,我觉得应该只能用异步io 事实上一般的事件模型的实现是用线程池

上面有人提到 nodejs 的事件循环,据我了解,事件循环并不是 es 的规范里的内容,所以上面有人说"引擎按照规范实现事件循环"应该是不准确的
nodejs 的事件模型是基于 libuv 的,libuv 印象中是用线程池来实现事件模型

回到顶部