2 回答
TA贡献1847条经验 获得超11个赞
像 Transformer 这样的 JAXP 类是接口,并且它们有多种实现(目前使用最广泛的两个是 Xalan 和 Saxon)。打破多线程规则的实际效果将取决于您使用的处理器;但在这两种情况下,它们都是相当不可预测的。Transformer 可能保存变量和动态执行上下文的当前状态,因此您确实不希望两个转换重写彼此的变量。
为了避免每次使用时重新编译样式表的成本,您需要缓存 Templates 对象,而不是 Transformer 对象。理论上,您可以连续重用 Transformer 在单个线程中连续执行多个转换,但这没有意义:只需为每个新转换创建一个新的 Transformer(从缓存的模板)。
另一件需要注意的事情是 DOM 不是线程安全的,即使在只读模式下也是如此。不允许两个转换同时访问同一棵 DOM 树。如果您确实需要在多个转换之间共享源文档,那么最好的方法最终取决于您使用的是 Xalan 还是 Saxon。
TA贡献1862条经验 获得超7个赞
要编译和缓存固定代码,请使用newTemplates
创建Templates
对象,https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source -,然后为多线程环境中的每次执行使用newTransformer
该Templates
对象创建一个新的Transformer
.
添加回答
举报