changeset 6:eae0bc17379a

Hand-written loop -> ScheduledExecutorService.
author shade
date Wed, 14 Dec 2016 20:07:00 +0100
parents 98d295144a63
children b846cd430ac5
files src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java
diffstat 1 files changed, 29 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Dec 14 20:00:08 2016 +0100
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Dec 14 20:07:00 2016 +0100
@@ -29,6 +29,9 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.awt.image.BufferedImage;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 class ShenandoahVisualizer {
 
@@ -89,6 +92,7 @@
         DataProvider data = new DataProvider(args[0]);
 
         img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
+
         VisPanel p = new VisPanel();
         p.addComponentListener(new VisPanelListener());
 
@@ -100,40 +104,40 @@
         frame.getContentPane().add(statusPanel, BorderLayout.SOUTH);
         frame.setSize(WIDTH, HEIGHT);
         frame.setVisible(true);
+
+        ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
+        service.scheduleAtFixedRate(() -> {
+            render(data);
+            frame.repaint();
+        }, 0, 100, TimeUnit.MILLISECONDS);
+
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
-                doRepaint = false;
+                service.shutdown();
+                frame.dispose();
             }
         });
+    }
+
+    public static void render(DataProvider data) {
         int cols = (int) Math.floor(Math.sqrt(data.maxRegions()));
         int rows = (int) Math.floor(data.maxRegions() / cols);
-        while (doRepaint) {
-            long start = System.currentTimeMillis();
-            synchronized (ShenandoahVisualizer.class) {
-                isMarking = (data.status() & 0x1) > 0;
-                isEvacuating = (data.status() & 0x2) > 0;
-
-                int rectWidth = img.getWidth() / cols;
-                int rectHeight = img.getHeight() / rows;
-                Graphics g = img.getGraphics();
-                for (int i = 0; i < data.maxRegions(); i++) {
-                    int rectx = (i % cols) * rectWidth;
-                    int recty = (i / rows) * rectHeight;
+        isMarking = (data.status() & 0x1) > 0;
+        isEvacuating = (data.status() & 0x2) > 0;
 
-                    RegionStat s = data.regionStat(i);
-                    s.render(g, rectx, recty, rectWidth, rectHeight);
-                }
-                g.dispose();
-            }
-            long duration = System.currentTimeMillis() - start;
-            long sleep = 100 - duration;
-            if (sleep > 0) {
-                Thread.sleep(sleep);
-            }
-            frame.repaint();
+        int rectWidth = img.getWidth() / cols;
+        int rectHeight = img.getHeight() / rows;
+        Graphics g = img.getGraphics();
+        for (int i = 0; i < data.maxRegions(); i++) {
+            int rectx = (i % cols) * rectWidth;
+            int recty = (i / rows) * rectHeight;
+
+            RegionStat s = data.regionStat(i);
+            s.render(g, rectx, recty, rectWidth, rectHeight);
         }
-        frame.dispose();
+        g.dispose();
     }
+
 }