2017-02-22 8 views
1

私は4つのスレッドが実行されている以下のコードを実行しようとしています。Groovyマルチタスク

各スレッドはmylistに1文字を追加しようとしています。各実行の後、リストには4つの要素が任意の順序でなければなりません。しかし、このコードがjenkinコンソールで実行されているときには、それぞれ異なる時間数の要素が取得されます。すなわち、[A, B, Null], [C,null,D],[A,B,C,D]

マルチタスキングのためにいくつかの同期の問題があるようです。私はsynchronizeキーワードを使用してリストに要素を追加するメソッドを追加しようとしましたが、それは助けになりませんでした。

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 

答えて

1

リストが同時にアクセスされ、4つのスレッドで変更されているためです。

以下のようにリストタイプをCopyOnWriteArrayListに変更することで修正できます。

したがって、上記のコードの唯一の変更は、Globalsクラスのリストタイプを変更することです。変更されたコードスニペットは次のとおりです。

import java.util.concurrent.CopyOnWriteArrayList 
class Globals { 
    static def mylist = [] as CopyOnWriteArrayList 
} 

によって、スレッドを処理するのはGroovyで非常に簡単です。参照することができますsample

+0

FYI ...静的なdef mylist = []としてのCopyOnWriteArrayListの 'def'は余分です。 –

+0

それは私の問題を解決したラオに感謝します。 –

+0

助けてくれてうれしい。感謝の意を表することができます。 – Rao

関連する問題