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
是多余的。很高兴它有所帮助。你可以投票表示感谢。