2017-02-22 29 views
1

我想执行下面的代码,其中四个线程正在运行。Groovy多任务

每个线程都试图将一个字符添加到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

仅供参考......静态def mylist = []中的'def作为CopyOnWriteArrayList'是多余的。 –

+0

它解决了我的问题谢谢饶。 –

+0

很高兴它帮助。您可能会赞赏地投票。 – Rao