我正在尝试执行以下代码,其中运行了四个线程。
每个线程都试图将一个字符添加到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
答案 0 :(得分:1)
这是因为,列表被4个线程同时访问和修改。
您可以通过将列表类型更改为CopyOnWriteArrayList
来解决此问题,如下所示。
因此,上述代码中唯一的变化是更改Globals
类中的列表类型。这是更改的代码段。
import java.util.concurrent.CopyOnWriteArrayList
class Globals {
static def mylist = [] as CopyOnWriteArrayList
}
通过它,在groovy中处理线程会容易得多。您可以参考sample