Hallo zusammen
Ich habe folgendes Problem. Ich habe mir eine Klasse (buffer) gebastelt, die mir eine einfach verkettete Liste erzeugt. Soweit geht auch noch alles.
Ich lege 2 Listen an ( new buffer() ). Diese 2 Listen übergebe ich 3 Threads. Dem ersten beide Zeiger auf die Listen und den anderen beiden jeweils nur einen Zeiger. Der erste Thread schreibt abwechselnd Daten in einen der beiden Listen. Sobald in einer Liste Daten da sind, holen die entsprechenden Threads die Daten aus der Liste und zeigen sie an. Leider kommt es bei mir vor, das falsche Daten ausgelesen werden.
Wie kann ich sicherstellen, dass immer nur ein Thread auf die Listen zugreift? Bei mir kommt immer ein Error wenn Thread2b auf die Liste zugreifen will.
Ich habe folgendes Problem. Ich habe mir eine Klasse (buffer) gebastelt, die mir eine einfach verkettete Liste erzeugt. Soweit geht auch noch alles.
Ich lege 2 Listen an ( new buffer() ). Diese 2 Listen übergebe ich 3 Threads. Dem ersten beide Zeiger auf die Listen und den anderen beiden jeweils nur einen Zeiger. Der erste Thread schreibt abwechselnd Daten in einen der beiden Listen. Sobald in einer Liste Daten da sind, holen die entsprechenden Threads die Daten aus der Liste und zeigen sie an. Leider kommt es bei mir vor, das falsche Daten ausgelesen werden.
Wie kann ich sicherstellen, dass immer nur ein Thread auf die Listen zugreift? Bei mir kommt immer ein Error wenn Thread2b auf die Liste zugreifen will.
E:\testing java>java TextThreadDemo
Ende TextThreadDemo
Thread1 in b1 (1/0): test b1
Thread1 in b2 (0/1): test b2
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b1 (1/1): test b1
Thread2a Länge: 0 --- Daten: test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1
Code:
public class data_test {
data_test next_data; // Referenz auf nächstes Objekt
String command;
public data_test () {
this.next_data = null;
this.command = "";
}
}
Code:
class buffer_test {
data_test first_data;
data_test last_data;
volatile int length = 0;
public buffer_test () {
first_data = null;
last_data = null;
}
public synchronized void write_data (data_test daten) {
if (first_data == null) {
// Noch kein Element vorhanden
first_data = daten;
last_data = daten;
}
else {
last_data.next_data = daten; // altes letztes Element verketten
last_data = daten; // neues letztes Element setzen
}
length++;
}
public synchronized data_test read_data () {
// Erstes Element löschen
data_test daten;
if (first_data != null) {
// Es ist mind. noch 1 Element in der Kette vorhanden
daten = first_data;
if (first_data.next_data == null) {
// Nur noch 1 Element in der Kette vorhanden
first_data = null;
last_data = null;
}
else {
// Es sind noch mehr Elemente in der Kette
first_data = first_data.next_data;
}
length--;
return daten;
}
return null;
}
public synchronized int length() {
return length;
}
}
Code:
public class TextThreadDemo {
public static void main(String args[]) {
TextThread1 output;
TextThread2a input1;
TextThread2b input2;
buffer_test buf1 = new buffer_test();
buffer_test buf2 = new buffer_test();
output = new TextThread1(buf1,buf2);
input1 = new TextThread2a(buf1);
input2 = new TextThread2b(buf2);
output.start();
input1.start();
input2.start();
System.out.println ("Ende TextThreadDemo");
}
}
Code:
class TextThread1 extends Thread {
buffer_test b1,b2;
data_test daten;
public String name1 = "test_";
public TextThread1(buffer_test buf1, buffer_test buf2) {
super("TextThread1");
b1 = buf1;
b2 = buf2;
}
public void run() {
for(int i = 0; i < 50; i++) {
try {
if (i % 2 == 0) {
daten = new data_test();
daten.command = "test b1";
b1.write_data (daten);
System.out.println ("Thread1 in b1 (" + b1.length() + "/" + b2.length() + "): " + daten.command);
}
else {
daten = new data_test();
daten.command = "test b2";
b2.write_data (daten);
System.out.println ("Thread1 in b2 (" + b1.length() + "/" + b2.length() + "): " + daten.command);
}
}
catch (IllegalMonitorStateException e) {
System.out.println ("Fehler(1): b Monitor war besetzt");
}
}
daten = new data_test();
daten.command = "ENDE";
b1.write_data (daten);
daten = new data_test();
daten.command = "ENDE";
b2.write_data (daten);
System.out.println ("Thread 1 Ende");
}
}
Code:
class TextThread2a extends Thread {
String text = "Thread 2";
buffer_test b;
data_test daten;
String com = "";
public TextThread2a(buffer_test buf) {
super("TextThread2");
b = buf;
}
public void run() {
String com = null;
try {
daten = b.read_data();
if (daten != null) {
com = daten.command;
}
}
catch (IllegalMonitorStateException e) {
System.out.println ("Fehler(2): b Monitor war besetzt");
}
while (com != "ENDE") {
try {
//b.show_data();
daten = b.read_data();
if (daten != null) {
com = daten.command;
if (com.equals("test b1")) {
System.out.println ("Thread2a Länge: " + b.length() + " --- Daten: " + com);
}
else {
System.out.println ("Thread2a: (" + com + ") !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!");
}
}
else {
com = "";
}
try {
sleep(100);
}
catch(InterruptedException e) {
}
}
catch (IllegalMonitorStateException e) {
System.out.println ("Fehler(2): b Monitor war besetzt");
}
} // Ende while
System.out.println("Thread 2a Ende");
}
}
Code:
class TextThread2b extends Thread {
String text = "Thread 2";
buffer_test b;
data_test daten;
String com = "";
public TextThread2b(buffer_test buf) {
super("TextThread2");
b = buf;
}
public void run() {
String com = null;
try {
daten = b.read_data();
if (daten != null) {
com = daten.command;
}
}
catch (IllegalMonitorStateException e) {
System.out.println ("Fehler(2): b Monitor war besetzt");
}
while (com != "ENDE") {
try {
//b.show_data();
daten = b.read_data();
if (daten != null) {
if (com.equals("test b2")) {
System.out.println ("Thread2b Länge: " + b.length() + " --- Daten: " + com);
}
else {
System.out.println ("Thread2b: (" + com + ") !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!");
} }
else {
com = "";
}
try {
sleep(100);
}
catch(InterruptedException e) {
}
}
catch (IllegalMonitorStateException e) {
System.out.println ("Fehler(2): b Monitor war besetzt");
}
} // Ende while
System.out.println("Thread 2b Ende");
}
}