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%

@kevinrushforth apologies for previous, my local repos seem to be messed up 
when i changed remotes from old javafx github repo to new one, as that rogue 
commit didnt exist my side for some reason. looks like its fixed now

-------------

PR: https://git.openjdk.java.net/jfx/pull/117

Reply via email to