2017-02-22 4 views
1

Я пытаюсь выполнить приведенный ниже код, в котором работают четыре потока.Groovy multi tasking

Каждый поток пытается добавить один символ в mylist. После каждого прогона в списке должно быть 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' в' static def mylist = [] как CopyOnWriteArrayList' является излишним. –

+0

Его решена моя проблема. Спасибо Рао. –

+0

Рад, что это помогло. Вы можете голосовать в знак признательности. – Rao