C# 多线程的等待所有线程结束的一个问题


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

using System;

using System.Threading;

namespace ConsoleApplication1

{

    class Program

    {

        private static AutoResetEvent[] events;

        static void Main(string[] args)

        {

            int threadNum = 10;

            Thread[] thread = new Thread[threadNum];

            events = new AutoResetEvent[threadNum];

            for (int i = 0; i < threadNum; i++)

            {

                var waithandler = new AutoResetEvent(false);

                events[i] = waithandler;

                ThreadStart starter = delegate

                {

                    var param = new Tuple<string, AutoResetEvent>("test print:" + i, waithandler);

                    Print(param);

                };

                thread[i] = new Thread(starter)

                {

                    Name = "thread" + i.ToString()

                };

            }

            for (int i = 0; i < threadNum; i++)

            {

                thread[i].Start();

            }

            WaitHandle.WaitAll(events);

            Console.WriteLine("Completed!");

            Console.Read();

        }

        private static void Print(object param)

        {

            var p = (Tuple<string, AutoResetEvent>)param;

            Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");

            Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);

            Thread.Sleep(300);

            Console.WriteLine(Thread.CurrentThread.Name + ": End!");

            p.Item2.Set();

        }

    }

}

一次性地Set,其实使用ManualResetEvent就足够了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

using System;

using System.Collections.Generic;

using System.Threading;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            var waits = new List<EventWaitHandle>();

            for (int i = 0; i < 10; i++)

            {

                var handler = new ManualResetEvent(false);

                waits.Add(handler);

                new Thread(new ParameterizedThreadStart(Print))

                {

                    Name = "thread" + i.ToString()

                }.Start(new Tuple<string, EventWaitHandle>("test print:" + i, handler));

            }

            WaitHandle.WaitAll(waits.ToArray());

            Console.WriteLine("Completed!");

            Console.Read();

        }

        private static void Print(object param)

        {

            var p = (Tuple<string, EventWaitHandle>)param;

            Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");

            Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);

            Thread.Sleep(300);

            Console.WriteLine(Thread.CurrentThread.Name + ": End!");

            p.Item2.Set();

        }

    }

}

来自为知笔记(Wiz)

时间: 2024-10-12 09:52:49

C# 多线程的等待所有线程结束的一个问题的相关文章

[转]C# 多线程的等待所有线程结束的一个问题

using System; using System.Threading; namespace ConsoleApplication1 { class Program { private static AutoResetEvent[] events; static void Main(string[] args) { int threadNum = 10; Thread[] thread = new Thread[threadNum]; events = new AutoResetEvent[t

C# 多线程的等待所有线程结束 用 ManualResetEvent 控制

using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var waits = new List<EventWaitHandle>(); for (int i = 0; i < 10; i++) { var handler = new Ma

Java Thread.join()详解--父线程等待子线程结束后再结束

目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 回到顶部 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需

Java多线程协作CountDownLatch,主线程等待子线程结束

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count);构造方法参数指定了计数的次数 public void countDown(); countDown方法,当前线程调用此方法,则计数减一 public void await() awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 ===============================

Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值.CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行.假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调

编写多线程代码时,启动线程后等待线程结束方法

在编写多线程代码时,如果主线程结束,那么子线程也会随之结束,如何等待线程结束再往下执行.   等待线程执行完成代码.   线程代码:   package demo; import java.util.concurrent.CountDownLatch; public class NodeSqlThread1 implements Runnable{         private CountDownLatch cdlSync;         public NodeSqlThread1(Coun

Java主线程如何等待子线程执行结束(转)

工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标志位, 判断子线程是否已经完成. 被动式指主线程被动的等待子线程的结束, 很明显, 比较符合人们的胃口. 就是你事情做完了, 你告诉我, 我汇

Java_如何等待子线程执行结束

工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标志位, 判断子线程是否已经完成. 被动式指主线程被动的等待子线程的结束, 很明显, 比较符合人们的胃口. 就是你事情做完了, 你告诉我, 我汇

python多线程(等待)主线程和子线程的同步执行

#!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time def fun(name, ls_name, front_thread = None): ''' 线程启动函数 通过front_thread来使用线程有序的运行 ''' time.clock() time.sleep(2) # 如果front_thread存在,则在front_thread运行完成后,才运行当前线程 if front_thread