Applet JSObject javascript调用序列化吗?

时间:2009-08-04 15:01:36

标签: java javascript browser concurrency applet

applet javascript调用以任何正确的方式进行序列化吗?我正在考虑实现一个模型,其中两个线程发送javascript命令。一个响应来自浏览器(js)的请求,另一个响应浏览器定期。我的问题是:如果这两个javascript请求发生冲突会发生什么?

我担心并发的javascript请求,因为直觉让我相信其中一个调用会以不确定的方式失败。

2 个答案:

答案 0 :(得分:2)

Javascript是单线程的。在任何给定时间只能执行一个代码块;触发的任何其他事件,方法等将等待当前正在执行的代码终止。 Google Chrome的javascript引擎可能是一个例外 - 我记得他们在功能中提到了某种多线程javascript支持,但我不确定它是如何工作的。在IE 6中,当JS代码运行时,浏览器UI实际上将变得无响应(例如,如果您使用关键字'debugger'停止在断点处,或者将IE设置为调试,那么)。

答案 1 :(得分:1)

序列化?你的意思是同步吗? JSObject通过将基元传递给单个JSContext JNI NPAPI包装器来工作,该包装器作用于底层浏览器实现中的DOM。你是指通过JNI传递原语吗?

我不太了解chrome的JS引擎是如何工作的,但我认为由于chrome中的liveconnect NPAPI与其他引擎相同,因此编写多线程javascript的能力与多线程JSObject访问无关。受影响的代码扩展了firefox使用的相同抽象JSObject类。

JSObject / liveconnect有几个实现 - 一些用于netscape / firefox,一个用于ie(ocx)。就多线程而言,所有行为都不同。

就liveconnect而言,DOM访问通常不是线程安全的。因此,正式地,访问DOM的多个线程是未定义的。如果你设法通过DOMService.run()中的代码范围之外的其他东西实际访问DOM,你将会遇到疯狂的死锁和竞争条件。

所以,基本上,你需要所有的java线程只将所有DOMActions发布到你的DOM访问调度线程。