zoukankan      html  css  js  c++  java
  • Thread(线程)和ThreadPool(线程池) Thread回调与返回值

    Thread(线程)

    Thread开启线程:接收一个参数

    TestClass tc = new TestClass();
                //没有返回值,有一个object类型的参数的委托;两种写法。
                ParameterizedThreadStart threadStart1 = t => tc.TestThread(t.ToString());
                //ParameterizedThreadStart threadStart2 = new ParameterizedThreadStart(tc.TestThread);
                List<Thread> threadList = new List<Thread>();
                for (int i = 0; i < 5; i++)
                {
                    Thread thread = new Thread(threadStart1);
                    thread.Start("test" + i);
                    threadList.Add(thread);
                }
    
                //等待Thread执行结束1,
                while (threadList.Count(c => c.ThreadState == ThreadState.Running) > 0)
                {
                    Thread.Sleep(1000);
                }
    
                //等待Thread执行结束2,附加都主线程,
                //主线程会等待附加的线程结束,然后再执行下面的操作,会卡界面。
                //foreach (var item in threadList)
                //{
                //    item.Join();
                //}
    
                Console.Read();
    View Code

    测试方法:

    public class TestClass
        {
            public void TestThread(object name)
            {
                Console.WriteLine("TestThreadStart ThreadID:{0},Name:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, name, DateTime.Now.ToString());
                long num = 0;
                for (int i = 0; i < 99999999; i++)
                {
                    num += i;
                }
                string result = num.ToString();
                Console.WriteLine("TestThreadEnd ThreadID:{0},Name:{1},Time:{2},Result:{3}", Thread.CurrentThread.ManagedThreadId, name, DateTime.Now.ToString(), result);
            }
        }

    Thread,默认是 前台线程,前台线程 即使 程序进程 结束,前台线程也会继续执行完毕。

    后台线程:会随着 程序进程 的结束而强制结束,无论是否执行完毕。

    Thead.Join()是附加到主线程上面,所以当 程序进程 结束的时候,被Join的线程也会强制结束。

    Thread.IsBackground 可以设置 是否是后台线程。

    Thread回调、返回值

    /// <summary>
            /// Thread实现回调函数;通过修改共有变量,获取Thread返回值;
            /// </summary>
            /// <param name="func"></param>
            /// <param name="callBack"></param>
            /// <returns></returns>
            public string ThreadWithCallBack(Func<string> func, Action callBack)
            {
                string result = null;
                ThreadStart threadStart = new ThreadStart
                    (
                        () =>
                        {
                            result = func();
                            callBack();
                        }
                    );
                Thread thread = new Thread(threadStart);
                thread.Start();//线程开始
                thread.Join();//附加到主线程,主线程将等待异步结束
                return result;
            }

    ThreadPool(线程池)维护一定数量的线程,当有新的线程申请时,分配空闲线程给他使用,使用完毕后释放,线程可以重复使用。

    而Thread每次都是申请新的线程,回收需要GC垃圾回收机制自动回收。

    线程池里的线程全部都是后台线程。获得最大 工作线程、io线程。

    int workerThreads = 0, ioThreads = 0;

    ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);

    线程池实现异步、线程池等待:

    #region ThreadPool 线程池实现异步、线程池等待
                {
                    TestClass tc = new TestClass();
                    //线程池实现异步
                    //WaitCallback callBack = t => { tc.TestThread(t); };
                    //ThreadPool.QueueUserWorkItem(callBack, "ThreadPoolTest");
    
                    //int workerThreads = 0, ioThreads = 0;
                    //ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
    
                    //线程池等待
                    //当设为 false,为非终止状态,WaitOne() 不会立即返回,等待Set() =>执行 Set() 后,变成终止状态
                    //当设为 true,为终止状态,WaitOne() 立即返回,等待Set() =>执行 Set() 后,变成终止状态
                    ManualResetEventSlim manualReset = new ManualResetEventSlim(false);//ManualResetEventSlim 是线程安全的
                    WaitCallback callBack1 = t => 
                    {
                        tc.TestThread(t);
                        manualReset.Set();
                    };
                    //执行线程池
                    ThreadPool.QueueUserWorkItem(callBack1, "ThreadPoolTest");
                    //等待线程执行结束
                    manualReset.WaitHandle.WaitOne();
                }
                #endregion
  • 相关阅读:
    C/C++分别读取文件的一行
    (转载)C库函数strtok()
    (转载)C++常量折叠和C语言中const常量对比
    ssh
    ubuntu ufw
    uplevel
    ubuntu lucid source.list
    tail
    socket client with proc
    pack forget
  • 原文地址:https://www.cnblogs.com/xsj1989/p/7831694.html
Copyright © 2011-2022 走看看