zoukankan      html  css  js  c++  java
  • 多线程应用扫盲(如何简单使用多线程)

           ps:最近对多线程的简单应用做了些简单的了解。

            一:对线程任务的简单封装

          

    /// <summary>
        /// 任务线程
        /// </summary>
        public class TaskdPool : IDisposable
        {
            public List<ThreadTask> TaskPool = new List<ThreadTask>();
            private Thread _thread;
            /// <summary>
            /// 任务池
            /// </summary>
            private Thread MyThread { get { return _thread; } set { _thread = value; } }
            static int maxCount = 30;
            /// <summary>
            /// 向任务池添加一个任务单元!
            /// </summary>
            /// <param name="task"></param>
            public void AddTask(ThreadTask task)
            {
                if (maxCount < TaskPool.Count)
                {
                    return;
                }
                var tasks = TaskPool.Where(p => p.MarkGuid == task.MarkGuid);
                if (tasks.Any())
                {
                    var theTask = tasks.Take(1).Single();
                }
                TaskPool.Add(task);
            }
            bool isRurn { get; set; }
            /// <summary>
            /// 启动线程 执行任务
            /// by zhiyong 2013.10.19
            /// </summary>
            public void StartThread()
            {
    
                MyThread = new Thread(new ThreadStart(DoTask));
                MyThread.Name = "线程" + Guid.NewGuid().ToString();
                MyThread.Start();
                isRurn = true;
    // 此处可拓展,自定义线程池,将线程添加到线程池。当线程因为未知原因挂起或者程序占用资源居高不下的时候可以对线程池强制回收收资源。
    // LogManager.Logs["短信线程日志"].WriteLine("线程:" + MyThread.Name + "开启"); } /// <summary> /// 任务开始 回调函数 /// chenzhiyong 2013.10.19 /// </summary> private void DoTask() { if (TaskPool.Count > 0) { foreach (var item in TaskPool) { item.Function(item.item); } } Dispose(); } #region IDisposable 成员 public void Dispose() { if (MyThread != null) { MyThread.IsBackground = false; //LogManager.Logs["短信线程日志"].WriteLine("线程:" + MyThread.Name + "关闭"); isRurn = false; try { MyThread.Abort(); // GC.Collect(); } catch (Exception) { } } } #endregion }
    线程执行完毕后会调用 abort方法将线程终止。只是终止。GC会在适合的时候回收终止的线程。

    二:对线程任务单元的简单封装
    /// <summary>
        /// 线程任务单元
        /// </summary>
        public class ThreadTask
        {
           public Func<Sms_Send,bool> Function;
           public string MarkGuid { get; set; }
           public Sms_Send item { get; set; }
      
          
        }
    
    

    三:简单的调用

                   ThreadTask task = new ThreadTask();
                    task.item = item;
                    task.MarkGuid = DateTime.Now.ToString("yyyyMMddhhmmss");
                    task.Function = StartSend;
                    TaskdPool _taskPoll = new TaskdPool();
                    _taskPoll.AddTask(task);
                    _taskPoll.StartThread();
    1 ,StartSend 这是一个回调函数。
    2, _taskPoll.AddTask(task); 是将任务单元添加到任务池子。
    3,item是一个实体类。会调函数用的到。

    ps:欢迎指正!
  • 相关阅读:
    变焦与对焦的区别
    教你在Zuul中增加Filter过滤请求
    FEIGN开启对HYSTRIX支持
    Feign使用Hystrix
    Spring Boot中使用Redis小结
    Spring 中的事件机制 ApplicationEventPublisher
    SpringBoot+EasyExcel实现Excel的导出
    SpringBoot–集成验证码kaptcha实现验证码功能
    Spring Cloud使用Feign调用服务接口
    Spring cloud ReadTimeout 问题解决
  • 原文地址:https://www.cnblogs.com/xiachong-0769/p/3377667.html
Copyright © 2011-2022 走看看