标签: event-queue

如何连接事件循环,回调队列和Javascript的单线程?

一般目标

我想知道以下javascript环境如何作为系统互连.

  • Javascript引擎
  • 事件循环
  • 事件队列

我们可以将此限制为浏览器环境,因为节点已在另一篇文章中介绍(此处)

我(相信)理解的事情:

  • Javascript是单线程的,因此只有一个callstack.

  • Javascript环境只提供一些真正异步的函数.这些可能包括setTimeout(),setInterval()和I/O函数.

  • 如果不使用其中一个,开发人员就无法创建自己的异步函数.
  • Javascript本身同步运行,但通过它的异步函数可以在当前的callstack清除后回调可能的阻塞函数.

例:

      console.log(‘Sync code started…’);

      setTimeout(function asyncLog() {
           console.log(‘Async function has completed’)
      }, 2000);

      console.log(‘Sync code finished…')
Run Code Online (Sandbox Code Playgroud)

示例步骤:

(如果我错了,请纠正步骤)

  1. 记录"同步代码已启动..."
  2. setTimeout被添加到堆栈但立即返回控件
  3. setTimeout被发送到另一个'thread'...'worker'?在javascript的单线程之外计算2000毫秒
  4. 记录"同步代码已完成..."
  5. 在2000毫秒之后,asyncLog()被推送到事件队列
  6. 由于callstack已清除,因此Event Loop会检查事件队列是否有待处理的回调
  7. asyncLog()从队列中删除,并由事件循环推送到堆栈
  8. 记录了"异步功能已完成"
  9. callstack现在很清楚了

质询

如果有人可以概述async函数(例如setTimeout)从第一次访问callstack到回调到callstack的时间和位置的步骤的概述,则不需要逐个回答这些步骤.

  1. 在第3步,谁产生这个新线程?是浏览器吗?
    • 这个新线程被阻止正确吗?
    • 如果你有一个创建1000 setTimeouts的循环会发生什么.是否创建了1000个"线程"?
    • 一次可以生成多少个线程是否有限制?
    • 当新线程完成执行时,它如何最终在队列中?
  2. 谁提供了事件队列?
  3. 谁提供事件循环?
    • 事件循环是否轮询事件队列?
    • javascript的线程是否知道事件循环?或者Event循环只是把东西推到堆栈上?
    • 事件循环如何知道堆栈何时清除?

javascript asynchronous event-loop event-queue single-threaded

20
推荐指数
1
解决办法
5742
查看次数

在javascript/jquery中获取正在运行的线程id的方法

我是javascript/jquery的新手.我有一个简单的问题,一个java脚本函数正在运行,并希望看到该线程的线程ID.在java中我们喜欢

Thread.getID();//in java

这将打印正在运行的线程的线程ID.以类似的方式,我们使用什么函数来获取javscript中正在运行的线程id.

其实我想要的是......

在我的JavaScript中,我有一个正在收听频道的听众.当通道中有消息时,将调用回调方法并处理数据.所以在这里我试图看看它是如何工作的.假设通道中有10条消息,每条消息都会调用回调.

假设回调方法正在运行消息"a",并且在处理消息"a"的数据时,它得到另一个消息"b".一旦消息"a"的处理完成,是否会调用"b"的回调方法?

我想通过在回调函数中打印线程号来检查这一点,该函数告诉它是按顺序运行(一个线程)还是多个线程.这就是为什么我试图打印线程ID.谢谢你的回复.

谢谢,斯瓦蒂

javascript jquery event-queue

7
推荐指数
2
解决办法
5472
查看次数

Java + Swing:编写代码以合并更改事件

我有这个数据流,粗略地说:

DataGenerator -> DataFormatter -> UI
Run Code Online (Sandbox Code Playgroud)

DataGenerator可以快速生成数据; DataFormatter可以将其格式化以用于显示目的; UI只是一堆Swing元素.

我想让我的DataGenerator像这样:

class DataGenerator
{
   final private PropertyChangeSupport pcs;
   ...
   public void addPropertyChangeListener(PropertyChangeListener pcl) {
     this.pcs.addPropertyChangeListener(pcl); 
   }
   public void removePropertyChangeListener(PropertyChangeListener pcl) {
     this.pcs.removePropertyChangeListener(pcl);
   }
}
Run Code Online (Sandbox Code Playgroud)

this.pcs.firePropertyChange(...)只要我的数据生成器有新数据就调用; 然后,我可以做dataGenerator.addPropertyListener(listener)在那里listener负责推动变化着的DataFormatter,然后到用户界面.

这种方法的问题在于,每秒有数千个dataGenerator更改(根据我的情况,每秒10,000到60,000之间),并且为UI格式化它的计算成本足够高,它会给我带来不必要的负担中央处理器; 我真正关心的是每秒最多10-20次变化.

有没有办法使用类似的方法,但在变更事件到达DataFormatter之前合并它们?如果我收到关于单个主题的多个更新事件,我只关心显示最新的事件,并且可以跳过所有以前的事件.

java swing event-queue

6
推荐指数
1
解决办法
1272
查看次数

SwingUtilities线程和AWT.EventQueue线程之间的区别

我正在使用Netbeans 7 IDE开发GUI桌面应用程序.当我创建JFrame类时,Netbeans使用

java.awt.EventQueue.invokeLater(new Runnable(){}

启动可运行对象.但我的应用程序也有摆动组件.

我想知道之间的区别

 java.awt.EventQueue threads
Run Code Online (Sandbox Code Playgroud)

SwingUtilities threads
Run Code Online (Sandbox Code Playgroud)

用于GUI应用程序开发.

java swing awt event-queue swingutilities

3
推荐指数
1
解决办法
1348
查看次数