Add method to allow users to add application shutdown hooks

This commit is contained in:
Will Hedgecock 2022-02-18 11:25:26 -06:00
parent 024c757eab
commit d86f261f6b
2 changed files with 33 additions and 1 deletions

View File

@ -36,8 +36,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* This class provides native access to serial ports and devices without requiring external libraries or tools.
@ -52,6 +54,7 @@ public final class SerialPort
// Static initializer loads correct native library for this machine
static private final String versionString = "2.9.1";
static private final String tmpdirAppIdProperty = "fazecast.jSerialComm.appid";
static private List<Thread> shutdownHooks = new ArrayList<Thread>();
static private volatile boolean isAndroid = false;
static private volatile boolean isWindows = false;
static private volatile boolean isShuttingDown = false;
@ -406,6 +409,17 @@ public final class SerialPort
{
public void run()
{
// Run any user-specified shutdown hooks
try {
for (Thread hook : shutdownHooks)
{
hook.start();
hook.join();
}
}
catch (InterruptedException e) {}
// Un-initialize the native library
isShuttingDown = true;
uninitializeLibrary();
}
@ -443,6 +457,23 @@ public final class SerialPort
*/
static public final String getVersion() { return versionString; }
/**
* Registers a shutdown hook that will run just before the application fully closes, due to either
* exiting normally or in response to a user interrupt such as Ctrl+C.
* <p>
* These hooks can be used to carry out any final serial port operations that should be executed to
* ensure graceful disconnection or device shutdown.
* <p>
* There is no need to add a shutdown hook just to close all open ports, as this is done automatically
* by the library; however, any special reads, writes, or port handling that should take place prior
* to closing of the ports should be handled in a shutdown hook registered with this method.
*
* @param hook A {@link java.lang.Thread} object that will run just before the application shuts down.
* @see java.lang.Runtime#addShutdownHook(Thread)
* @see java.lang.Thread
*/
static public final synchronized void addShutdownHook(Thread hook) { shutdownHooks.add(hook); }
/**
* Returns a list of all available serial ports on this machine.
* <p>

View File

@ -2,7 +2,7 @@
* SerialPortTest.java
*
* Created on: Feb 27, 2015
* Last Updated on: Jan 28, 2022
* Last Updated on: Feb 18, 2022
* Author: Will Hedgecock
*
* Copyright (C) 2012-2022 Fazecast, Inc.
@ -84,6 +84,7 @@ public class SerialPortTest
static public void main(String[] args)
{
System.out.println("\nUsing Library Version v" + SerialPort.getVersion());
SerialPort.addShutdownHook(new Thread() { public void run() { System.out.println("\nRunning shutdown hook"); } });
SerialPort[] ports = SerialPort.getCommPorts();
System.out.println("\nAvailable Ports:\n");
for (int i = 0; i < ports.length; ++i)