飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

多任务多线程分配的策略探讨

Author:飘易 Source:飘易
Categories:C#编程 PostTime:2011-9-10 22:17:19
正 文:
    在应用软件中,多线程并发操作对于很多应用是非常重要的,多线程可以有效的提高程序的运行效率。那么我们就有必要探讨下多任务如何分配给多线程的策略。

    飘易目前一般会采用以下2种多线程分配策略:

    一、分块分配策略
    像一些下载软件如flashget、快车、迅雷等一样,将任务分块,每一块交给一个线程执行。这种情况下,每个线程处理多个任务。
    【缺点】:每个线程分配到的任务可能不等,比如20个任务,分配给3个线程,第一个、第二个线程都是处理6个任务,但是第三个线程处理了剩下的8个任务,比前2个线程多出了2个任务。这就造成了第三个线程完成的时间明显比前2个长,拖慢了整个任务的完成时间。

    二、定时器监控下的动态分配
    增加一个定时器,定时器动态的监控当前有多少个线程,当少于设定的线程时自动增加线程来处理。此种情况下,每个线程只处理一个任务。可以保证始终有设定数量的线程在处理任务。并不会出现最后一个线程拖慢整个任务完成的时间。
    【缺点】:增加了一个定时器的开销。但这个成本几乎可以忽略不计。

     下面飘易拿C#语言下的程序举例:

         //全局变量
         System.Timers.Timer thread_timer = new System.Timers.Timer(1000); //实例化Timer类
         private static object lockobj = new object(); //线程锁
         int threadnum = 1; //总线程数
         int threadnumnow = 0; //在用线程数
         int rowstotal = 1; //总任务数
         int currentrow = 0; //当前任务

        private void button1_Click(object sender, EventArgs e)
        {//多线程 开始任务
            threadnum = 3; //总线程数
            threadnumnow = 0;
            rowstotal = 20 //总任务数
            currentrow = 0;

            //启动线程检查定时器
            thread_timer .Elapsed  += new System.Timers.ElapsedEventHandler(thread_timer_Elapsed);
            thread_timer.AutoReset = true;
            thread_timer.Enabled = true;
        }

        void thread_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {//线程检查器
            if (currentrow >= rowstotal)
            {
                thread_timer.Enabled = false;
            }
            else
            {
                if (threadnumnow < threadnum)
                {
                    Thread newThread = new Thread(new ParameterizedThreadStart(createThread_test));
                    newThread.IsBackground = true;
                    newThread.Start(currentrow); //传参
                    lock (lockobj) { currentrow++; threadnumnow++; }
                }
            }
        }

        private void createThread_test(object p)
        {//测试线程
            int rx = Convert.ToInt32(p); //当前行索引
            dataGridView1.Rows[rx].Cells[7].Value = rx + 1;
            Thread.Sleep(4000);
            dataGridView1.Rows[rx].Cells[7].Value = "ok";
            lock (lockobj) { threadnumnow--; }
        }
作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:TweetRobots:Twitter批量注册工具!
下一篇:Dreamhost主机和PHP zip压缩的故事!
1条评论 “多任务多线程分配的策略探讨”
1 江湖人儿
2014-12-17 10:16:21
我一直都在想应该怎么弄都没有解决,非常感谢你的分享。
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2019 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有