在.NET4中,另一个新增的抽象线程是Parallel类。这个类定义了并行的for和 foreach的静态方法。在为for和foreach定义的语言中,循环从一个线程中运行Parallel类使用多个任务,因此使用多个线程来完成这个作业。

Parallel.For()和Paralle1.ForEach()方法多次调用同一个方法,而Parallel.InvokeO方法允许同时调用不同的方法。

1.Parallel.For()方法循环

在For()方法中,前两个参数定义了循环的开头和结束。示例从0迭代到9.第3个参数是一个Action<int>委托。整数参数是循环的迭代次数,该参数被传递给加Action<int>委托引用的方法。

Parallel.For()方法的返回类型是ParalleLoopResult结构,它提供了循环是否结束的信息。

ParallelLoopResult result = Parallel.For(0, 10, i => {

                Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);

                Thread.Sleep(10);

            });

 

            Console.WriteLine(result.IsCompleted);

            Console.ReadKey();

在ParalleI.ForO的方法体中,把索引、任务标识符和线程标识符写入控制台中。从输出可以看出,顺序是不能保证的。 

也可以提前中断Parallel.For方法。Parallel.For方法的一个重载版本接受第3个Action<int,ParallelLoopState>类型的参数。使用这些参数定义一个方法,就可以调用ParalleLoopstate的Break()或stop0方法,以影响循环的结果。

注意,迭代的顺序没有定义。

ParallelLoopResult result = Parallel.For(0, 10, (int i,ParallelLoopState pls) =>
            {
                Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
                if (i > 5)
                    pls.Break();
            });

            Console.WriteLine(result.IsCompleted);
            Console.WriteLine(result.LowestBreakIteration);
            Console.ReadKey();

Parallel.For方法可能使用几个线程来执行循环。如果需要对每个线程进行初始化,就可以使用Parallel.For<TLocal>方法。除了form和to对应的值之外,For()方法的泛型版本还接受3个委托参数。

第一个参数的类型是Func<TLocal>,因为这里的例子对于TLocal使用字符串,所以该方法需要定义为Func<string>,即返回string的方法。这个方法仅对于用于执行迭代的每个线程调用一次。

第二个委托参数为循环体定义了委托。在示例中,该参数的类型是Func(int,,ParallelLoopState,string,string)。其中第一个参数是循环迭代,第二个参数ParallelLoopState允许停止循环,如前所述。循环体方法通过第3个参数接收从init方法返回的值,循环体方法还需要返回一个值,其类型是用泛型for参数定义的。

For()方法的最后一个参数指定一个委托Action<TLocal>;在该示例中,接收一个字符串。这个方法仅对于每个线程调用一次,这是一个线程退出方法。

多线程处理 java 多线程处理for循环_线程

多线程处理 java 多线程处理for循环_多线程处理 java_02

2.Parallel.ForEach()方法循环

Parallel.ForEach()方法遍历实现了IEnumerable的集合,其方式类似于foreach语句,但以异步方式遍历。这里也没有确定遍历顺序。


多线程处理 java 多线程处理for循环_线程_03


如果需要中断循环,就可以使用ForEachO方法的重载版本和ParallelLoopState参数。其方式与前面的For()方法相同。ForEach()方法的一个重载版本也可以用于访问索引器,从而获得迭代次数,如下所示:


多线程处理 java 多线程处理for循环_线程_04


3.Parallel.Invoke()方法调用多个方法

如果多个任务应并行运行,就可以使用Parallel.Invoke()方法。Parallel.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法。示例代码传递了要并行调用的Foo()和Bar()方法:

static void Main(string[] args)
        {
Action
            a += Bar;
            a += Bar;
            a += Bar;
            a += Bar;
 
Parallel.Invoke(a);
Console.ReadKey();
           
        }
 
static void
        {
Console.WriteLine("foo");
        }
 
static void
        {
Console.WriteLine("Bar");}