Java AWT PrinterJob.setPrintable()执行缓慢的原因排查求助
Java AWT PrinterJob.setPrintable()执行缓慢的原因排查求助
最近碰到个特别头疼的问题,我运行一段调用Java AWT打印API的代码时,setPrintable()方法居然耗时将近一分钟!下面是我的代码、运行结果和排查过程,想请大家帮忙分析下背后的原因:
我的测试代码如下:
package printertest; import java.awt.print.PrinterJob; import java.time.LocalDateTime; public class Printertest { public static void main(String[] args) { System.out.println("java.version: "+System.getProperty("java.version")); PrinterJob printerJob = PrinterJob.getPrinterJob(); LocalDateTime time = LocalDateTime.now(); System.out.println(time); printerJob.setPrintable(new PrintObject()); time = LocalDateTime.now(); System.out.println(time); } }
运行后输出:
java.version: 21.0.1 2025-06-09T12:17:06.215255200 2025-06-09T12:17:54.463001900
从时间戳能明显看出来,setPrintable()方法花了快一分钟才执行完成。
我跟进代码排查后发现,耗时的根源在Sun.awt.windows.WPrinterJob类里的这个方法:
private long getPrintDC() { return handleRecord.mPrintDC; }
对应的调用栈是:
WPrinterJob.getPrintDC() line: 934 WPrinterJob.getDefaultPage(PageFormat) line: not available [native method] WPrinterJob.defaultPage(PageFormat) line: 767 WPrinterJob(RasterPrinterJob).setPrintable(Printable) line: 1166 Printertest.main(String[]) line: 13
还有几个值得注意的细节:
- 我在配置更差的笔记本上跑同样的代码,最多只花了一秒钟就执行完了
- 两台设备都是Windows 11系统,唯一的区别是台式机上添加的打印机数量更多
- 我搜了下发现其他用户也遇到过类似问题,但都没找到明确的解决方案:比如
setPrintable或print方法执行慢、Java打印API整体响应迟缓之类的情况
补充更新:我后来发现等待时间居然和打印机的状态直接相关!测试一台处于关闭状态的打印机时,就出现了这种慢得离谱的情况;而打开打印机后,setPrintable()几乎瞬间就执行完成了。
想请教大家,这种情况到底是什么原因导致的?
内容来源于stack exchange
相关产品推荐
相关产品推荐

