On Wed, 19 Feb 2020 19:14:08 GMT, Dell Green <github.com+12861109+dellgr...@openjdk.org> wrote:
> https://bugs.openjdk.java.net/browse/JDK-8176499 > > This pull request fixes a long standing issue in the MonocleTimer class > whereby it has a dependency on the > java.uti.Timer class which is dependent on system time and can cause UI > freezes for seconds/minutes/hours/days/years > dependent upon how far back in time the system clock is set by either a user > manually or NTP. This looks like it is > because the Timer class will wait for (executionTime - currentTime) before > proceeding if a task hasn't fired yet. > https://hg.openjdk.java.net/jdk10/master/file/be620a591379/src/java.base/share/classes/java/util/Timer.java#l553 > For a > long running embedded device with a UI like IOT devices this is pretty > disastrous. We recently re-discovered this issue > whilst testing such a device before going into production. > The MonocleTimer class is used by MonocleApplication and QuantumToolkit class > to create its pulseTimer for emebdded > systems and sets it up to fire periodically inline with the requested pulse > frequency which by default is 60Hz > resulting in a pulse interval of 16ms. It is well documented that for > implementations that wish to measure elapsed > time ScheduledThreadPoolExecutor should be used as a replacement for > java.util.Timer class. > Java Concurrency In Practice: > https://pdfs.semanticscholar.org/3650/4bc31d3b2c5c00e5bfee28ffc5d403cc8edd.pdf > (page 77) > > "The Timer facility manages the execution of deferred ("run this task in 100 > ms") and periodic ("run this task every > 10ms") tasks. However, Timer has some drawbacks, and > ScheduledThreadPoolExecutor should be thought of as its > replacement." With the original implementation, if I set the date.time back > 8 years for example the UI freezes up > indefinitely (I cant wait 8 years). Repeating the same test with the proposed > implementation has no affect on the UI > and it runs as normal. The proposed solution has been tested on an Arm iMX6 > board. > > Whist testing in isolation the MonocleTimer class with no work to do on each > pulse, it looks like the change from Timer > class to ScheduledThreadPoolExecutor also has brought with it a greater > accuracy of when the pulses are fired. > The following results were observed when running MonocleTimer at 60Hz for 1 > minute. It appears that we get a higher > frequency of pulses hitting the 16ms mark with the replacement solution > > x86-64 linux desktop: > > ---- Timer class ---- > NumSamples: 3599 > Mean: 16.230063906640734 > StdDev: 0.45021901536403147 > Median: 16 > Mode: 16, freq: 2714, perc: 75.40983606557377% > > > ---- Scheduler class ---- > NumSamples: 3599 > Mean: 16.0 > StdDev: 0.0 > Median: 16 > Mode: 16, freq: 3599, perc: 100.0% > > > > Arm linux iMX6: > > ---- Timer class ---- > NumSamples: 3599 > Mean: 16.182272853570435 > StdDev: 0.4224950723394174 > Median: 16 > Mode: 16, freq: 2837, perc: 78.82745207001946% > > > ---- Scheduler class ---- > NumSamples: 3599 > Mean: 15.995554320644624 > StdDev: 0.3666906549602725 > Median: 16 > Mode: 16, freq: 3468, perc: 96.3601000277855% This pull request has now been integrated. Changeset: 1cae6a87 Author: Dell Green <dell.gr...@ideaworks.co.uk> Committer: Johan Vos <j...@openjdk.org> URL: https://git.openjdk.java.net/jfx/commit/1cae6a87 Stats: 17 lines in 1 file changed: 8 ins; 3 del; 6 mod 8176499: Dependence on java.util.Timer freezes screen when OS time resets backwards Reviewed-by: jvos ------------- PR: https://git.openjdk.java.net/jfx/pull/117