mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-27 03:39:56 +00:00
fight java multi-threading
This commit is contained in:
parent
818187fe1b
commit
50400aa45c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user