******************************************** Code that calls the offending function: ******************************************** DebugMessage.println("loadAndGo() Initializing drivers"); Instantiator.InitializeDrivers(outbound); bp("after driver init"); DebugMessage.println("loadAndGo() Starting Outbound Message Queue"); outbound.startOutboundMessaging(); bp("after IBQ start"); DebugMessage.println("loadAndGo() Starting Inbound Message Queue"); inbound.startInboundMessaging(); // <<<<<<<<<<<<<< EXCEPTION OCCURS HERE bp("after OBQ start"); DebugMessage.println("loadAndGo() Priming communications pump..."); initializeComms(outbound,inbound); ******************************************** Code that contains the offending function: ******************************************** package nmc.common; import nmc.platform.*; import java.io.IOException; import nmc.platform.DatagramIoPort; import nmc.sidekick.Instantiator; import nmc.common.*; public class InboundMessageQ implements Runnable { private FifoQueue q = new FifoQueue(50); private DatagramIoPort dgmRx; Thread myThread; public InboundMessageQ(int myRxPortNumber) throws IOException { System.out.println("InboundMessageQ ctor "+myRxPortNumber); dgmRx = DatagramIoPort.GetRcvPort(myRxPortNumber); System.out.println("InboundMessageQ ctor got my port "); // we won't get here if an IOException is thrown myThread = new Thread(this); } public Message blockingGet() { System.out.println("InboundMessageQ.blockingGet() entry"); return (Message)q.blockingDequeue(); } public Message blockingGet(int timeout) { System.out.println("InboundMessageQ.blockingGet("+timeout+")"); return (Message)q.blockingDequeue(timeout); } public void getOne() throws IOException { System.out.println("InboundMessageQ.getOne() Inbound blocking on socket read..."); byte[] rcvdData = dgmRx.blockingRx(); Message m = DecerealizingFactory.parse(rcvdData); q.enqueue(m); System.out.println("InboundMessageQ.getOne() received: " + m.toString()); } public synchronized void startInboundMessaging() { try { System.out.println("InboundMessageQ.startInboundMessaging() creating thread"); myThread = new Thread(this); System.out.println("InboundMessageQ.startInboundMessaging() starting thread"); myThread.start();// <<<<<<<<<<<<<< EXCEPTION OCCURS HERE } catch (Exception e) { System.out.println("InboundMessageQ.startInboundMessaging() Inbound caught exception, stopping. e="+ e); } System.out.println("InboundMessageQ.startInboundMessaging() returning"); } public void run() { System.out.println("InboundMessageQ.run() InboundMessage thread starting..."); try { while (true) { getOne(); } } catch (Exception e) { System.out.println("InboundMessageQ.run() Inbound caught exception, stopping. e="+ e); } } public boolean isEmpty() { return q.isEmpty(); } } ******************************************** Output: ******************************************** loadAndGo() Initializing drivers Driver: TheMicroKatDriverRev2.1 initializing channel nmc.sidekick.DpaBoard$DpaLe ftChannel@43d068 Setting current limit = 1200 In setCurrentLimit(int milliamps) DpaLeftChannel movePot(dir=0; steps=1 Connecting Comms Ground Connecting Instrument Power Switching Instrument power ON doing a LeftChannelCtrlReg write() Switching comms power ON doing a LeftChannelCtrlReg write() Starting Inbound Message Queue... DriverMessageQ Ctor depth 5 drvr nmc.sidekick.MicroKat@440098 DriverMessageQ.startInboundMessaging() starting Done with initialization Driver: TheEMeterDriverRev2.0 initializing channel nmc.sidekick.DpaBoard$DpaRigh tChannel@43bcd0 Setting current limit = 1000 In setCurrentLimit(int milliamps) Connecting Comms Ground Connecting Instrument Power Switching Instrument power ON doing a RightChannelCtrlReg write() Switching comms power ON doing a RightChannelCtrlReg write() Starting Inbound Message Queue... DriverMessageQ Ctor depth 5 drvr nmc.sidekick.eMeter@43fecc DriverMessageQ.startInboundMessaging() starting Done with initialization StdEnvSensorDrvr Initializing ADC... Initializing initAdcCsN Starting Inbound Message Queue... DriverMessageQ Ctor depth 5 drvr nmc.sidekick.SKHumidity@43fe64 DriverMessageQ.startInboundMessaging() starting Done with base class initialization SKHumidity Initializing RHPowerOn SKHumiditySensor Powering OFF StdEnvSensorDrvr Initializing ADC... initAdcCsN already initialized Starting Inbound Message Queue... DriverMessageQ Ctor depth 5 drvr nmc.sidekick.SKPressureTemp@43fe24 DriverMessageQ.startInboundMessaging() starting DriverMessageQ.run() InboundFifo thread starting... DriverMessageQ.getOne() InboundFifo blocking on socket read... DriverMessageQ.blockingGet() doing blocking dequeue DriverMessageQ.run() InboundFifo thread starting... DriverMessageQ.getOne() InboundFifo blocking on socket read... DriverMessageQ.blockingGet() doing blocking dequeue DriverMessageQ.run() InboundFifo thread starting... DriverMessageQ.getOne() InboundFifo blocking on socket read... DriverMessageQ.blockingGet() doing blocking dequeue Done with base class initialization Initializing SKPressureTemp commandParser.bp()after driver init loadAndGo() Starting Outbound Message Queue OutboundMessageQ.startOutboundMessaging creating thread OutboundMessageQ.startOutboundMessaging starting thread OutboundMessageQ.startOutboundMessaging returning commandParser.bp()after IBQ start loadAndGo() Starting Inbound Message Queue InboundMessageQ.startInboundMessaging() creating thread InboundMessageQ.startInboundMessaging() starting thread DriverMessageQ.run() InboundFifo thread starting... DriverMessageQ.getOne() InboundFifo blocking on socket read... DriverMessageQ.blockingGet() doing blocking dequeue OutboundMessageQ.run() thread starting... OutboundMessageQ.sendOne blocking Uncaught Exception in thread : com.ajile.jem.UserThread (hashCode:146825152, priority:5) package nmc.common; import nmc.platform.*; import java.io.IOException; import nmc.platform.DatagramIoPort; import nmc.sidekick.Instantiator; import nmc.common.*; public class InboundMessageQ implements Runnable { private FifoQueue q = new FifoQueue(50); private DatagramIoPort dgmRx; Thread myThread; public InboundMessageQ(int myRxPortNumber) throws IOException { System.out.println("InboundMessageQ ctor "+myRxPortNumber); dgmRx = DatagramIoPort.GetRcvPort(myRxPortNumber); System.out.println("InboundMessageQ ctor got my port "); // we won't get here if an IOException is thrown myThread = new Thread(this); } public Message blockingGet() { System.out.println("InboundMessageQ.blockingGet() entry"); return (Message)q.blockingDequeue(); } public Message blockingGet(int timeout) { System.out.println("InboundMessageQ.blockingGet("+timeout+")"); return (Message)q.blockingDequeue(timeout); } public void getOne() throws IOException { System.out.println("InboundMessageQ.getOne() Inbound blocking on socket read..."); byte[] rcvdData = dgmRx.blockingRx(); Message m = DecerealizingFactory.parse(rcvdData); q.enqueue(m); System.out.println("InboundMessageQ.getOne() received: " + m.toString()); } public synchronized void startInboundMessaging() { try { System.out.println("InboundMessageQ.startInboundMessaging() creating thread"); myThread = new Thread(this); System.out.println("InboundMessageQ.startInboundMessaging() starting thread"); myThread.start(); } catch (Exception e) { System.out.println("InboundMessageQ.startInboundMessaging() Inbound caught exception, stopping. e="+ e); } System.out.println("InboundMessageQ.startInboundMessaging() returning"); } public void run() { System.out.println("InboundMessageQ.run() InboundMessage thread starting..."); try { while (true) { getOne(); } } catch (Exception e) { System.out.println("InboundMessageQ.run() Inbound caught exception, stopping. e="+ e); } } public boolean isEmpty() { return q.isEmpty(); } }