fight java multi-threading

This commit is contained in:
mila@ringwald.ch 2015-02-19 14:40:48 +00:00
parent 818187fe1b
commit 50400aa45c

View File

@ -15,6 +15,7 @@ public class BTstackClient {
private volatile SocketConnection socketConnection; private volatile SocketConnection socketConnection;
private PacketHandler packetHandler; private PacketHandler packetHandler;
private boolean connected; private boolean connected;
private int logicTime = 1;
private Thread rxThread; private Thread rxThread;
private String unixDomainSocketPath; private String unixDomainSocketPath;
private int tcpPort; private int tcpPort;
@ -39,6 +40,8 @@ public class BTstackClient {
public boolean connect(){ public boolean connect(){
rxThread = null;
if (tcpPort == 0){ if (tcpPort == 0){
try { try {
Class<?> clazz = Class.forName("com.bluekitchen.btstack.SocketConnectionUnix"); Class<?> clazz = Class.forName("com.bluekitchen.btstack.SocketConnectionUnix");
@ -66,12 +69,16 @@ public class BTstackClient {
connected = socketConnection.connect(); connected = socketConnection.connect();
if (!connected) return false; if (!connected) return false;
logicTime++;
final int rxThreadId = logicTime;
final SocketConnection threadSocketConnection = socketConnection;
rxThread = new Thread(new Runnable(){ rxThread = new Thread(new Runnable(){
@Override @Override
public void run() { public void run() {
while (socketConnection != null){ while (logicTime == rxThreadId){
Packet packet = socketConnection.receivePacket(); Packet packet = threadSocketConnection.receivePacket();
if (Thread.currentThread().isInterrupted()){ if (Thread.currentThread().isInterrupted()){
System.out.println("Rx Thread: exit via interrupt, thread id " + rxThreadId);
return; return;
} }
if (packet == null) { if (packet == null) {
@ -95,7 +102,7 @@ public class BTstackClient {
break; break;
} }
} }
System.out.println("Rx Thread: Interrupted"); System.out.println("Rx Thread: exit via logic time change, thread id " + rxThreadId);
} }
}); });
rxThread.start(); rxThread.start();
@ -118,18 +125,33 @@ public class BTstackClient {
public void disconnect(){ public void disconnect(){
if (socketConnection == null) return; if (socketConnection == null) return;
if (rxThread == null) return;
// signal rx thread to stop logicTime++;
rxThread.interrupt();
// wait for thread stopped // check if we're called on rx thread
try { if (Thread.currentThread() != rxThread){
rxThread.join();
} catch (InterruptedException e){ // signal rx thread to stop
System.out.println("Unexpected interrupted execption waiting for receive thread to terminate"); rxThread.interrupt();
e.printStackTrace();
// unblock read by sending an arbitrary command
if (this instanceof BTstack){
BTstack btstack = (BTstack) this;
btstack.BTstackGetState();
}
// wait for thread to stop
try {
rxThread.join();
} catch (InterruptedException e){
System.out.println("Unexpected interrupted execption waiting for receive thread to terminate");
e.printStackTrace();
}
} }
// disconnect socket
// disconnect socket -> triggers IOException on read
socketConnection.disconnect(); socketConnection.disconnect();
// done // done
socketConnection = null; socketConnection = null;
} }