Groovy多任务处理

时间:2017-02-22 01:59:05

标签: multithreading 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 个答案:

答案 0 :(得分:1)

这是因为,列表被4个线程同时访问和修改。

您可以通过将列表类型更改为CopyOnWriteArrayList来解决此问题,如下所示。

因此,上述代码中唯一的变化是更改Globals类中的列表类型。这是更改的代码段。

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

通过它,在groovy中处理线程会容易得多。您可以参考sample