2017-11-23 2 views
0

Also ich habe einen Thread, der das kleinste Zeichen in einem Array von Zeichen durch ein anderes, zufälliges Zeichen ersetzt. Der Thread wird ausgeführt, bis das Array nur aus 'z' besteht. Aber wenn ich mehrere Threads erzeuge, bekomme ich seltsame Ausgaben und ich frage mich, ob es das einzige Problem beim Drucken ist oder ob mein Code tatsächlich inkodiert ist.Ändern eines Arrays aus mehreren Threads

run() Methode in meinem Thread:

public void run() { 
    char[] expected = { 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z' }; 
    while (timesModified < 100 && !Arrays.equals(array, expected)) { 
     try { 
      array[findMinIndex(array)] = rndChar(); 
      timesModified++; 
      Thread.sleep(2000); 
      for (char c : array) { 
       System.out.print(c + " "); 
      } 
      System.out.println(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Mein Haupt:

public static void main(String[] args) { 
     char[] sa_table = new char[10]; 
     Arrays.fill(sa_table, 'a'); 
     Thread t = new Thread(new AddToTable(sa_table)); 
     Thread t1 = new Thread(new AddToTable(sa_table)); 
     Thread t2 = new Thread(new AddToTable(sa_table)); 
     t.start(); 
     t1.start(); 
     t2.start(); 
     try { 
      t.join(); 
      t1.join(); 
      t2.join(); 
     } catch (Exception e) { 
      System.out.println("Interrupted"); 
     } 
    } 

Ausgabe von der Konsole:

n n n a a a a a a a a a a a a a a a a a a a a a 
a a a a a a 

n u U a n u U a a a a a a a 
a a a a a a 
n u N a a a a a a a 
n n u o a a a a a a a 
u o K a a a a a a 
n u o i a a a a a a 
n u o i A a a a a a 
n u o i A a a a a a 
n u o i G a a a a a 
n u o i K a a a a a 
n u o i u a a a a a 
n u o i u s a a a a 
n u o i u s x a a a 
n n n u o i u s u o i u s x l a a 
u o i u s x l D a 
x l h a 
n u o i u s x l h H 
n u o i u s x l h D 
n u o i u s x l h a 
n u o i u s x l h r 
n u o i u s x l R r 
n u o i u s x l v r 
n u o C u s x l v r 
n u o b u s x l v r 
n n u o S u s x l v r 
u o D u s x l v r 
n u o T u s x l v r 
n u o l u s x l v r 
n u o M u s x l v r 
n u o M u s x l v r 
n u o t u s x l v r 
n u o t u s x m v r 
n u o t u s x J v r 
n u o t u s x R v r 
n u o t u s x i v r 
n u o t u s x t v r 
F u o t u s x t v r 
A u o t u s x t v r 
D u o t u s x t v r 
l u o t u s x t v r 
e u o t u s x t v r 
L u o t u s x t v r 
L u o t u s x t v r 
o u o t u s x t v r 
m u o t u s x t v r 
s u o t u s x t v r 
s u C t u s x t v r 
s u D t u s x t v r 
s u q t u s x t v r 
s u W t u s x t v r 
s u Y t u s x t v r 
s u C t u s x t v r 
s u s t u s x t v r 
s u s t u s x t v h 
s u s t u s x t v D 
s u s t u s x t v w 
I u s t u s x t v w 
c u s t u s x t v w 
g u s t u s x t v w 
b u s t u s x t v w 
N u s t u s x t v w 
O u s t u s x t v w 
u u s t u s x t v w 
u u E t u s x t v w 
u u u u C t u s x t v w 
u T u T t u s x t v w 
t u s x t v w 
u u u X t u s x t v w u X t u s x t v w 

u u D t u s x t v w 
u u u T t u s x t v w 
u u X t u s x t v w 
u e t u s x t v w 
u u f t u s x t v w 
u u C t u s x t v w 
u u u t u s x t v w 
u u u t u o x t v w 
u u u t u i x t v w 
u u u t u P x t v w 
u u u t u v x t v w 
u u u b u v x t v w 
u u u u u u K u v x t v w 
u u u x u v x t v w 
x u v x K v w 
u u u x u v x W v w 
u u u x u v x c v w 
u u u u u x u v x e v w 
u u u u x u v x n v w 
u u u x u v x q v w 
x u v x T v w 
u u u x u v x w v w 
z u u x u v x w v w 
z P u x u v x w v w 
z T u x u v x w v w 
z z b u x u v x w v w b u x u v x w v w 

z p u x u v x z p u x u v x w v w 
w v w 

Wie Sie sehen können, oft die Ausgabe unterschiedliche Länge hat und Ich bin mir nicht sicher, was es verursacht

+1

werden kann, weil der Druck von verschiedenen Threads ist die Verschachtelung. Versuchen Sie, 'Arrays.toString (array)' zu verwenden, um zu drucken und zu sehen, was passiert. – OldCurmudgeon

+0

Es hat geholfen.Vielen Dank – gryfon1997

Antwort

0

Ohne in den Code zu schauen, um zu prüfen, ob er die Aufgabe korrekt erledigt, ist die Antwort auf die unterschiedliche Länge einfach: Drei Threads drucken gleichzeitig Werte, so dass Sie nicht wissen, welcher Thread welchen Wert ausgedruckt hat.

beispielsweise die folgenden Zeilen:

u u u u C t u s x t v w 
u T u T t u s x t v w 
t u s x t v w 

wurden durch drei Fäden gedruckt. Aus diesem Grund ist die Gesamtzahl der Werte korrekt, ebenso wie die Anzahl der Zeilenumbrüche (3). Versuchen Sie, auf eine Weise zu drucken, die die Thread-ID für jeden Wert enthält, und Sie werden sehen, dass Sie nicht jedes Mal eine Zeile pro Thread erhalten haben, sondern eine Mischung aus Werten und Zeilenumbrüchen von jedem der beteiligten Threads.

Um dies zu vermeiden, können Sie einen StringBuilder verwenden, um die Werte jedes Threads zusammenzustellen und dann auf einmal auszudrucken.

Try this:

public void run() { 
    char[] expected = { 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z' }; 
    while (timesModified < 100 && !Arrays.equals(array, expected)) { 
     try { 
      array[findMinIndex(array)] = rndChar(); 
      timesModified++; 
      Thread.sleep(2000); 
      StringBuilder sb = new StringBuilder(); 
      for (char c : array) { 
       sb.append(c + " "); 
      } 
      System.out.println(sb); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

Es scheint, wie Sie die „Mutal Ausschluss“ oder „Mutex“ Problem hier konfrontiert sind:

https://en.wikipedia.org/wiki/Mutual_exclusion

Sie müssen sicherstellen, dass das Array nicht durch multilple Threads gleichzeitig bearbeitet wird.

+0

Editieren Array von verschiedenen Threads zur gleichen Zeit würde nicht die Größe des Arrays stark beeinträchtigen. Jemand in den obigen Kommentaren hat mir schon beim Drucken geholfen, aber ich werde mir das Mutex-Ding ansehen. Danke jedenfalls – gryfon1997

+1

Es würde nicht erklären, warum er unterschiedliche Längen auf seinen Arrays bekam. Es ist wahrscheinlich eher ein Druckproblem: sein 'for ... print' ist interlacing mit anderen Threads – Nathan

+0

Oh ja, ich sehe dein Recht Nathan, sorry! –

2

Ihr Problem kommt von hier:

for (char c : array) { 
     System.out.print(c + " "); 
    } 
    System.out.println(); 

Diese Schleife kann, während in einem Thread in der Mitte angehalten werden und in einem anderen starten, so dass Sie den Druck von zwei Threads haben, bevor Sie die println() nennen mischen.

Zum Beispiel, wenn Sie haben:

n n u o S u s x l v r 
u o D u s x l v r 

Es bedeutet, dass Sie diesen String hatte: n u o S u s x l v r, und ein Thread gestartet es drucken, es gedruckt, um die n, dann eine andere übernahm, gedruckt alles ->n n u o S u s x l v r + ein \n (println()), dann beendete der erste, was er tat, und druckte den Rest: u o D u s x l v r.

Verwandte Themen