如何从Java applet线程调用JavaScript回调?

时间:2010-08-29 22:49:37

标签: java javascript dom callback thread-safety

我在Java applet启动的线程中运行了一些长时间运行的Java代码。代码完成后,它就会为用户提供信息。我想以线程安全的方式将此信息传递给JavaScript回调。仅使用Java DOM API来修改HTML文档是不够的,除非我的JavaScript回调以线程安全的方式被调用为副作用(即最终,在执行JavaScript回调的同一浏览器线程中)。我该如何实现呢?图书馆已经在做了吗?

3 个答案:

答案 0 :(得分:2)

看起来好像您需要Common DOM API。从本质上讲,你请求一个DOMService在主要UI线程好的时候回调它。

http://docs.oracle.com/javase/1.5.0/docs/guide/plugin/developer_guide/java_js.html

据我所知,JSObject是“老方式”,而Common DOM API是更新的方式(从Java 6开始)。你需要做的是调用applet的方法并传递你想要回调的函数对象。然后,您的applet将从DOMAction中调用该函数对象。

我手边没有代码向您展示,这不是我在使用Java之前所做的事情。但是我使用了一个用C ++编写的NPAPI web插件的类似技术,即JS调用我的C ++对象将函数作为参数传递,然后在稍后阶段,让C ++对象调用JS函数。 '希望这会有所帮助。

答案 1 :(得分:1)

我遇到了多个调用Javascript的applet线程的并发问题。 Internet Explorer 8忽略了一些调用(Firefox 3.6和Safari 5工作正常)。

我尝试用DOMService.invokeAndWait包装对Javascript的调用 - 这没有帮助。

我最终确保所有Java-> Javascript调用都来自同一个线程,并且我的问题得到了解决(至少暂时 - 我还没有检查如果Javascript线程忙于某些用户会发生什么 - 开始工作)。

为了序列化这些电话,我使用了Executors.newSingleThreadExecutor

答案 2 :(得分:0)

似乎没有公共教程如何做到这一点。整个JavaScript-Java接口未被记录,并且受浏览器限制。