一. 并行编程

1. 区分串行编程和串行编程

①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。(典型代表for循环 下面例子从1-100按顺序执行)

②. 并行编程:充分利用多核cpu的优势,同时开启多个线程并行执行。(典型代表Parallel.For循环 下面例子从1-100无序执行)

代码实践:

1 { 2 //1. 串行 (从1-100按顺序执行) 3 for (int i = 1; i < 100; i++) 4 { 5 Console.WriteLine(i); 6 } 7 //2. 并行 (从1-100无序执行) 8 Parallel.For(1, 100, (item) => 9 {10 Console.WriteLine(item);11 });12 }

结论:串行的代码按顺序依次输出,并行的代码无顺序输出。

2. 深究Parallel类中的方法 (For方法、ForEach方法、Invoke方法 这三个方法都是用来开启线程的)

(1). Invoke方法

a. 该方法的作用就是用来同时开启多个线程的。

b. 该方法有两个重载,主要涉及到两个参数,用来配置最大并行数(即线程数)和一个可变的Action委托数组(详见源码)。

案例一: 开启五个不同的线程调用五个方法

我们发现一个现象,主线程等着这五个子线程执行完毕后才执行,但是我们并没有写线程等待的代码,所以我们可以总结:

①:并行计算,开启多个线程后,不需要再开辟线程等待,直接是主线程完成后续操作。

②:而普通多线程执行后,需要单独再开辟一个线程等待,然后主线程在执行。

代码实践:

1 {2 Parallel.Invoke(() => this.TestThread("bct1")3 , () => this.TestThread("bct2")4 , () => this.TestThread("bct3")5 , () => this.TestThread("bct4")6 , () => this.TestThread("bct5")7 );8 }




一个大的for循环里面可以放多个并行的循环吗java for循环并发执行_invoke 数组


案例二: 指定最大并行数进行线程调用

我们发现,五个任务中的四个任务同时由不同线程开启,当其中一个任务结束时,第五个任务开启,并由刚结束的任务的线程来执行。

{ //设置最大的线程并行数 ParallelOptions p = new ParallelOptions(); p.MaxDegreeOfParallelism = 4; Parallel.Invoke(p, () => this.TestThread("bct1") , () => this.TestThread("bct2") , () => this.TestThread("bct3") , () => this.TestThread("bct4") , () => this.TestThread("bct5") ); }


一个大的for循环里面可以放多个并行的循环吗java for循环并发执行_bc_02


(2). For方法 (前两个参数之间的差代表任务的个数)

这里介绍一个简单重载: public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action body);

fromInclusive:开始索引(含).

toExclusive:结束索引(不含).

body:将为每个迭代调用一次的委托.

当然该方法中的其他重载中也有很丰富的功能,比如也可以配置最大线程数。

代码实践:

1 { 2 //案例一:前两个参数之间的差,就为并行计算线程的个数 3 { 4 Parallel.For(5, 10, t => 5 { 6 //这里的t分别为:5,6,7,8,9 五个数 7 string name = string.Format("bct{0}