正确的方法是在 IO 线程中实际执行逻辑,如果它是非阻塞的。否则,将请求委托给专用线程,如下所示:public class Example { public static void main(String[] args) { Undertow server = Undertow.builder() .addListener(8080, "localhost") .setHandler(new HttpHandler() { public void handleRequest(HttpServerExchange exchange) throws Exception { if (valueIsPresentInCache(exchange)) { getValueFromCache(); // non-blocking, can be done from IO thread } else { if (exchange.isInIoThread()) { exchange.dispatch(this); // we return immediately, otherwise this request will be // handled both in IO thread and a Worker thread, throwing // an exception return; } fetchValueFromDatabase(); // blocking!!! } } }) .build(); server.start(); }}
1 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
屏幕和打印机是非常不同的媒体。在屏幕上,您通常具有大约 72 到 92 dpi(每英寸像素)的低分辨率。每个像素可以有大量的颜色(24m 或更多)。在打印机上,您通常具有高分辨率(高达 2540 dpi),但只有 2 (b/w) 到 6 种颜色。为了创建中间色,打印机将为您提供光栅化技术,例如半色调。
您创建BufferedImage 的方式严重偏向于屏幕输出:低分辨率、使用中间颜色进行抗锯齿等。结果会很差。此外,您的输出意图丢失了。打印机驱动程序只能看到像素图。它不知道文本是否存在以及文本在哪里,也无法为其优化输出。
为了提高质量,您主要有两种选择:
如果您只打印线条和文本,并且只使用打印机可以创建的颜色而不混合颜色,则可以创建一个与打印机分辨率和颜色完全匹配的BufferedImage 。那应该给你一个体面的质量。
否则,直接绘制到Printable。然后保留输出操作的意图,打印驱动程序可以产生最佳质量。我敢肯定,只要稍作思考,您就可以重构您的代码,使您仍然拥有一个非常易于维护的结构。
添加回答
举报
0/150
提交
取消