-
Bug
-
Resolution: Fixed
-
P3
-
8u72, 9
-
x86_64
-
windows_7
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8158288 | 8u112 | Mikhail Cherkasov | P3 | Resolved | Fixed | b01 |
J2SE Version (please include all output from java -version flag):
java version "1.8.0_75"
Java(TM) SE Runtime Environment (build 1.8.0_75-b07)
Java HotSpot(TM) Client VM (build 25.75-b07, mixed mode)
Does this problem occur on J2SE 6ux or 7ux or 8ux? Yes / No (pick one)
8U72, maybe more
Operating System Configuration Information (be specific):
HP EliteBook 8760W
Windows 7 Professional 64-bit (SP1)
8G Ram
Bug Description:
Having a trouble to have the print jobs finish when used a page range. It
might be coming from a thread race condition.
The printer queue shows them as being completely spooled and ready to
print, but the java thread that initiated the print is stuck.
---------------------------------------------------
com.sun.prism.j2d.print.J2DPrinterJob
The only place that pageDone is set to "true" is in waitForNextPage(int
pageIndex)
If pJob2D.print() ever completes, and sets jobDone to true, waitForNextPage() may never be called.
If this occurs, than the wait loop that the initiating thread is stuck in will never return.
It seems like the wait loops should always be checking on error and termination conditions.
---------------------------------------------------
pJob2D.print(printReqAttrSet);
jobDone = true;
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (jobError || jobDone || !getPage(pageIndex)) { *** If the
jobDone is true, getPage() will not be called ***
return Printable.NO_SUCH_PAGE;
}
while (!pageDone) { *** Not checking to see if an error
occurred or if the job is done. ***
synchronized (monitor) {
try {
monitor.wait(1000);
} catch (InterruptedException e) {
}
}
}
---------------------------------------------------
On a side note, these 1 second wait loops are way too long. My pages print almost instantaneously. These waits make these jobs take an order of
magnitude longer to spool. At the very least, they should be cut in half (or
a tenth) which, in the greater scheme of things, would likely not put any
significant burden on platforms currently capable of printing.
The real solution would actually be to "notify()" the "monitor" object when a
page was completed so that it wouldn't have to always incur that 1 second wait to begin with.
Steps to Reproduce (be specific):
In the real application, this time slice hits every time. In my test program, it does not and not sure why. (Threads...)
still working an creating a test program that will force the race condition
to occur.
- backported by
-
JDK-8158288 Print jobs do not finish when using a page range
- Resolved