1 package org.opentrafficsim.draw.graphs; 2 3 import java.util.concurrent.BlockingQueue; 4 import java.util.concurrent.LinkedBlockingQueue; 5 import java.util.concurrent.TimeUnit; 6 7 import org.djutils.logger.CategoryLogger; 8 9 /** 10 * The GraphUpdater can be used to repeatedly offer a value that is automatically processed in order of offering in a parallel 11 * Thread. 12 * <p> 13 * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br> 14 * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 15 * </p> 16 * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a> 17 * @author <a href="https://github.com/peter-knoppers">Peter Knoppers</a> 18 * @author <a href="https://github.com/wjschakel">Wouter Schakel</a> 19 * @param <T> type of value in queue 20 */ 21 public class GraphUpdater<T> 22 { 23 24 /** Queue of update times for executing Thread. */ 25 private final BlockingQueue<T> queue = new LinkedBlockingQueue<>(); 26 27 /** 28 * Constructs and starts a thread that performs each given task from a queue. 29 * @param workerName name for the working thread 30 * @param invokingThread invoking thread, the worker will stop when this thread is interrupted 31 * @param updater updater to perform with the queued value 32 */ 33 public GraphUpdater(final String workerName, final Thread invokingThread, final Updater<T> updater) 34 { 35 new Thread(new Runnable() 36 { 37 @SuppressWarnings({"synthetic-access"}) 38 @Override 39 public void run() 40 { 41 while (!invokingThread.isInterrupted()) 42 { 43 try 44 { 45 T t = GraphUpdater.this.queue.poll(5, TimeUnit.SECONDS); 46 if (t != null) 47 { 48 updater.update(t); 49 } 50 } 51 catch (InterruptedException exception) 52 { 53 CategoryLogger.always().error(exception, "Worker {} thread stopped.", workerName); 54 break; 55 } 56 } 57 } 58 }, workerName).start(); 59 } 60 61 /** 62 * Offer a next value to the queue. 63 * @param t next value to offer to the queue 64 */ 65 public final void offer(final T t) 66 { 67 this.queue.offer(t); 68 } 69 70 /** 71 * Functional interface for updates to perform. 72 * <p> 73 * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 74 * <br> 75 * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 76 * </p> 77 * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a> 78 * @author <a href="https://github.com/peter-knoppers">Peter Knoppers</a> 79 * @author <a href="https://github.com/wjschakel">Wouter Schakel</a> 80 * @param <T> type of value in queue 81 */ 82 @FunctionalInterface 83 interface Updater<T> 84 { 85 /** 86 * Perform an update. 87 * @param t value to update by 88 */ 89 void update(T t); 90 } 91 92 @Override 93 public String toString() 94 { 95 return "GraphUpdater [queue=" + this.queue + "]"; 96 } 97 98 }