You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:47:58