Hallo,
ich habe gerade ein kleines Thread-Experiment gemacht. Das Ergebnis kann ich mir nicht erklären.
Thread Version 1:
Thread Version 2
Der einzige Unterschied ist die while-Schleife in run().
setMotorEx:
ifm.iHandle(serial), hier geht was schief:
Threads erzeugen und laufen lassen:
JavaFish kann bis zu 8 Interfaces zu Modelen öffnen und ist ganz Empfindlich gegenüber fehlerhaften Aufrufen seiner member. Der Thread Version 1 tut was ich erwartet habe: Es laufen 8 Modelle und wenn das Neunte Laufen will tut es das auf und eins der ersten Acht steht.
Bei Thread Version 2 gibt es von Anfang an Fehler an der markierten Stelle in iHandle(serial).
Da iHandle(serial) synchronized ist wundere ich mich, dass es für JavaFish Aufrufe aus dieser Methode herraus einen Unterschied zwischen den Thread Versionen gibt.
Kann mir jemand den Unterschied erkären?
Viele Grüße
Michael
ich habe gerade ein kleines Thread-Experiment gemacht. Das Ergebnis kann ich mir nicht erklären.
Thread Version 1:
Java:
private class testThread extends Thread {
private JFish jFish = new JFish();
private int serial;
private int number = 1;
private int direction = 1;
private int speed = 6;
public testThread(Models model) {
serial = model.serial();
}
public testThread(Models model, int number) {
this.serial = model.serial();
this.number = number;
}
@Override
public void run() {
jFish.setMotorEx(serial, number, direction, speed);
}
}
Thread Version 2
Java:
private class testThread extends Thread {
private JFish jFish = new JFish();
private int serial;
private int number = 1;
private int direction = 1;
private int speed = 6;
public testThread(Models model) {
serial = model.serial();
}
public testThread(Models model, int number) {
this.serial = model.serial();
this.number = number;
}
@Override
public void run() {
while(true) {
jFish.setMotorEx(serial, number, direction, speed);
}
}
}
setMotorEx:
Java:
public synchronized int setMotorEx(int serial, int number, int direction, int speed) {
...
result = new JavaFish().jrSetMotorEx(ifm.iHandle(serial), number, direction, speed);
...
}
ifm.iHandle(serial), hier geht was schief:
Java:
public synchronized int iHandle(int serial) throws InvalidIHandleException {
int iHandle = jrError;
Pair cpair = new Pair(serial, iHandle);
if(pairs.contains(cpair)) {
iHandle = pairs.get(pairs.indexOf(cpair)).iHandle;
} else {
//close interfaces and remove, if necessary
if(pairs.size() >= SIZE){
iHandle = pairs.getFirst().iHandle;
int i = new JavaFish().jrCloseInterface(iHandle); //new instance necessary, because JavaFish instances might expire.
pairs.removeFirst();
}
iHandle = new JavaFish().jrOpenInterfaceUSB(ftDCB, serial);//new instance necessary, because JavaFish instances might expire HIER PASSIERT DER FEHLER
iHandleCheck(iHandle);
pairs.addLast(new Pair(serial, iHandle));
}
return iHandle;
}
Threads erzeugen und laufen lassen:
Java:
public synchronized void run8Plus1Threads() throws InterruptedException {
new testThread(Models.BAND0x11).start();
new testThread(Models.BAND0x13).start();
new testThread(Models.BAND0x21).start();
new testThread(Models.BAND0x23).start();
new testThread(Models.BAND0x3).start();
new testThread(Models.BAND0x5).start();
new testThread(Models.STAMP0x17, 2).start();
new testThread(Models.STAMP0x27, 2).start();
wait(5000);
Thread thread = new testThread(Models.LINE0x29, 2);
thread.start();
wait(50000);
}
JavaFish kann bis zu 8 Interfaces zu Modelen öffnen und ist ganz Empfindlich gegenüber fehlerhaften Aufrufen seiner member. Der Thread Version 1 tut was ich erwartet habe: Es laufen 8 Modelle und wenn das Neunte Laufen will tut es das auf und eins der ersten Acht steht.
Bei Thread Version 2 gibt es von Anfang an Fehler an der markierten Stelle in iHandle(serial).
Da iHandle(serial) synchronized ist wundere ich mich, dass es für JavaFish Aufrufe aus dieser Methode herraus einen Unterschied zwischen den Thread Versionen gibt.
Kann mir jemand den Unterschied erkären?
Viele Grüße
Michael