Multithreading Groovy多任务

Multithreading Groovy多任务,multithreading,groovy,Multithreading,Groovy,我正在尝试执行下面的代码,其中有四个线程正在运行 试图将一个字符添加到mylist的每个线程。每次运行后,列表中应按任意顺序包含4个元素。但是,当该代码在jenkin控制台中运行时,每次都会得到不同数量的元素。i、 e,[A,B,Null],[C,Null,D],[A,B,C,D] 这似乎是由于多任务导致的一些同步问题。我曾尝试使用synchronize关键字将方法add元素添加到列表中,但没有任何帮助 class Globals { static def mylist=[] } cla

我正在尝试执行下面的代码,其中有四个线程正在运行

试图将一个字符添加到
mylist
的每个线程。每次运行后,列表中应按任意顺序包含4个元素。但是,当该代码在
jenkin
控制台中运行时,每次都会得到不同数量的元素。i、 e,
[A,B,Null],[C,Null,D],[A,B,C,D]

这似乎是由于多任务导致的一些同步问题。我曾尝试使用
synchronize
关键字将方法add元素添加到列表中,但没有任何帮助

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

这是因为,列表正在被4个线程并发访问和修改

您可以通过将列表类型更改为
CopyOnWriteArrayList
来修复它,如下所示

因此,上述代码中唯一的更改是更改
Globals
类中的列表类型。下面是更改后的代码段

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

到目前为止,在groovy中处理线程要容易得多。也许你可以参考一个

FYI。。。
static def mylist=[]中的
def
作为CopyOnWriteArrayList
是多余的。很高兴它有所帮助。你可以投票表示感谢。