2017-02-22 5 views
1

Ich versuche, den folgenden Code auszuführen, in dem vier Threads ausgeführt werden.Groovy Multitasking

Jeder Thread versucht, das eine Zeichen zu mylist hinzuzufügen. Nach jedem Lauf sollten 4 Elemente in beliebiger Reihenfolge in der Liste stehen. Aber, wenn dieser Code in jenkin Konsole ausgeführt wird, erhalten jedes Mal andere Anzahl von Elementen. d.h. [A, B, Null], [C,null,D],[A,B,C,D].

Es scheint, als ob ein Synchronisationsproblem aufgrund von Multitasking. Ich habe versucht, Methode hinzufügen Element zur Liste hinzufügen mit synchronize Schlüsselwort, aber das hat nicht geholfen.

class Globals { 
static def mylist=[] 
} 

class TestMultiThreadExecution implements Runnable 
{ 
    String name; 
    public TestMultiThreadExecution(String name) { 
    this.name = name; 
} 

    //@Override 
    public void run() { 
    println "${name} Step 1" 
    Globals.mylist.push("${name}") 
} 
} 

    Globals.mylist.clear() 
    Thread thread1 = new Thread(new TestMultiThreadExecution("A"));   
    thread1.start(); 
    Thread thread2 = new Thread(new TestMultiThreadExecution("B")); 
    thread2.start(); 
    Thread thread3 = new Thread(new TestMultiThreadExecution("C")); 
    thread3.start(); 
    Thread thread4 = new Thread(new TestMultiThreadExecution("D")); 
    thread4.start(); 
    thread1.join(); 
    thread2.join(); 
    thread3.join(); 
    thread4.join(); 
    println Globals.mylist 

Antwort

1

Es ist, weil Liste wird gleichzeitig zugegriffen und durch 4 Threads geändert.

Sie können dies beheben, indem Sie den Listentyp wie unten gezeigt in CopyOnWriteArrayList ändern.

Die einzige Änderung im obigen Code besteht darin, den Listentyp in der Klasse Globals zu ändern. Hier ist das geänderte Code-Snippet.

Durch die, es wäre viel einfacher in groovy, mit Threads umzugehen. Vielleicht können Sie beziehen sich sample

+0

FYI ... Die 'def' in' static def mylist = [] als CopyOnWriteArrayList' ist überflüssig. –

+0

Es hat mein Problem gelöst Danke Rao. –

+0

Froh, dass es geholfen hat. Sie können abstimmen. – Rao