Use an executor for the reliability layer's writer task.

This commit is contained in:
akwizgran
2012-12-14 21:24:12 +00:00
parent 1e1a226f30
commit e5d15d42d6
2 changed files with 12 additions and 10 deletions

View File

@@ -170,7 +170,8 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
return false; return false;
} }
try { try {
ReliabilityLayer reliabilityLayer = new ReliabilityLayer(this); ReliabilityLayer reliabilityLayer =
new ReliabilityLayer(executor, this);
synchronized(this) { synchronized(this) {
if(!initialised) { if(!initialised) {
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
@@ -348,7 +349,8 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
return; return;
} }
try { try {
ReliabilityLayer reliabilityLayer = new ReliabilityLayer(this); ReliabilityLayer reliabilityLayer =
new ReliabilityLayer(executor, this);
synchronized(this) { synchronized(this) {
if(!initialised) { if(!initialised) {
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))

View File

@@ -7,6 +7,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -17,6 +18,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(ReliabilityLayer.class.getName()); Logger.getLogger(ReliabilityLayer.class.getName());
private final Executor executor;
private final WriteHandler writeHandler; private final WriteHandler writeHandler;
private final BlockingQueue<byte[]> writes; private final BlockingQueue<byte[]> writes;
@@ -24,10 +26,10 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
private volatile SlipDecoder decoder = null; private volatile SlipDecoder decoder = null;
private volatile ReceiverInputStream inputStream = null; private volatile ReceiverInputStream inputStream = null;
private volatile SenderOutputStream outputStream = null; private volatile SenderOutputStream outputStream = null;
private volatile Thread writer = null;
private volatile boolean running = false; private volatile boolean running = false;
ReliabilityLayer(WriteHandler writeHandler) { ReliabilityLayer(Executor executor, WriteHandler writeHandler) {
this.executor = executor;
this.writeHandler = writeHandler; this.writeHandler = writeHandler;
writes = new LinkedBlockingQueue<byte[]>(); writes = new LinkedBlockingQueue<byte[]>();
} }
@@ -39,8 +41,8 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
decoder = new SlipDecoder(receiver); decoder = new SlipDecoder(receiver);
inputStream = new ReceiverInputStream(receiver); inputStream = new ReceiverInputStream(receiver);
outputStream = new SenderOutputStream(sender); outputStream = new SenderOutputStream(sender);
writer = new Thread("ReliabilityLayer") { running = true;
@Override executor.execute(new Runnable() {
public void run() { public void run() {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
long next = now + TICK_INTERVAL; long next = now + TICK_INTERVAL;
@@ -61,7 +63,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
} }
} catch(InterruptedException e) { } catch(InterruptedException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.warning("Interrupted while writing"); LOG.warning("Interrupted while waiting to write");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
running = false; running = false;
} catch(IOException e) { } catch(IOException e) {
@@ -70,9 +72,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
running = false; running = false;
} }
} }
}; });
running = true;
writer.start();
} }
InputStream getInputStream() { InputStream getInputStream() {