ThreadPool

转载 2012年03月31日 13:46:17
static void Main(string[] args)
        {
            //放进去的顺序不一定和执行的顺序一致!多线程执行中需要注意的一点!
            //把任务分配给10个人,执行完成的顺序是不可预测的,不确定的
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("准备把{0}号任务放到了QueueUserWorkItem中", i);
                //ThreadPool.QueueUserWorkItem(DoJob,i);
                ThreadPool.QueueUserWorkItem(new WaitCallback(DoJob), i);
                //WaitCallback w1 = new WaitCallback(DoJob);
                //WaitCallback w2 = DoJob;//这写法是new WaitCallback(DoJob)的简写
                Console.WriteLine("{0}号任务已经放到了QueueUserWorkItem中",i);
                //放到线程池中并不代表会立即会执行,线程池会根据线程池中的繁忙情况来安排委托代码的执行。

            }
            Console.ReadKey();
        }

        static void DoJob(object state)
        {
            Console.WriteLine(state);//这句话和Console.WriteLine("{0}号任务已经放到了QueueUserWorkItem中",i);的执行顺序是不确定的。
            Console.WriteLine("{0}执行完毕", state);//这两句话的先后顺序是确定的,当然中间可能会被别的线程插入东西
        }
namespace 多线程下载帖子
{
    public partial class Form1 : Form
    {
        private DateTime startTime;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = 1; i <= 100; i++)
            {
                using (WebClient webclient = new WebClient())
                {
                    webclient.DownloadString("http://nt.discuz.net/showtopic-"+i+".html");
                }
            }
            stopwatch.Stop();
            MessageBox.Show(stopwatch.ElapsedMilliseconds.ToString());//21秒
        }
        /// <summary>
        /// 多线程下载按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //强类型DataSet
            T_ThreadsTableAdapter adapter = new T_ThreadsTableAdapter();
            //删除数据
            adapter.DeleteAll();
            //循环插入数据序号,和状态  0未下载,1下载
            for (int i = 1; i <= 100; i++)
            {
                adapter.Insert(i, 0, "");
            }
            //记时
            startTime = DateTime.Now;
            //循环下载
            for (int i = 1; i <= 100; i++)
            {
                //将下载信息放入线迟中
                //运用委托,调用下载函数 也可以 ThreadPool.QueueUserWorkItem(new WaitCallback(DownloadHtml), i);
                ThreadPool.QueueUserWorkItem(DownloadHtml, i);
            }
            //将更新下载状态函数放入线程池  也可以 ThreadPool.QueueUserWorkItem(new WaitCallback(ScanFinished), i);
            ThreadPool.QueueUserWorkItem(ScanFinished);//为什么这不需要参数,而ScanFinished还需要参数?
            //多线程的好处,批量代发工资的项目,rupeng域名的获得,站内搜索爬帖子
            //以后做项目的时候发现程序运行速度慢,第一个想到的解决方案就是多线程,百试不爽!
        }
        /// <summary>
        /// 下载函数方法
        /// </summary>
        /// <param name="state"></param>
        private void DownloadHtml(object state)
        {
            T_ThreadsTableAdapter adapter = new T_ThreadsTableAdapter();
            int tid = Convert.ToInt32(state);
            using (WebClient webclient = new WebClient())
            {
                string html = webclient.DownloadString("http://nt.discuz.net/showtopic-" + tid + ".html");
                adapter.UpdateThread(1, html, tid);//任务完成,更新数据库表中的任务状态为:已经完成
            }            
        }
        /// <summary>
        /// 更新下载状态函数方法
        /// </summary>
        /// <param name="state">委托必须要求的参数,当没有参数的情况下,State为null</param>
        private void ScanFinished(object state)
        {
            T_ThreadsTableAdapter adapter = new T_ThreadsTableAdapter();
            while (true)//一遍遍的扫描
            {                
                int count = (int)adapter.GetUnfinishedCount();
                if (count <= 0)//当任务全部完成的时候count为0,退出扫描
                    break;
            }
            //在数据执行完成后,将后台线程方法放到主线程中去显示打印信息
            this.BeginInvoke(new Action(delegate()
            {
                TimeSpan ts = DateTime.Now - startTime;
                MessageBox.Show("任务全部完成,时间:" + ts.TotalMilliseconds);//11秒,因为网速的原因,并发下载互相影响下载速度,所以提速不是很明显。
            }));

        }

    }
}

python 线程池threadpool之实现

上一节介绍了线程池threadpool的安装和使用,本节将主要介绍线程池工作的主要流程: (1)线程池的创建 (2)任务的创建 (3)任务的推送到线程池 (4)线程处理任务 (5)线程池的退...
  • hehe123456ZXC
  • hehe123456ZXC
  • 2016年08月20日 05:24
  • 6701

linux下boost的一个扩展线程池-threadpool-的学习

转自:http://www.cnblogs.com/xiaouisme/archive/2012/10/04/2711691.html安装boost:http://www.boost.org/下载bo...
  • mark20170902
  • mark20170902
  • 2017年02月17日 16:34
  • 845

初学Python-threadpool多线程编程

1、示例及说明 /Users/nisj/PycharmProjects/EsDataProc/thread_pool_ping.py # -*- coding=utf-8 -*- import t...
  • BabyFish13
  • BabyFish13
  • 2016年12月24日 17:22
  • 824

C# ThreadPool理解

在程序中,我们经常会遇到需要多线程处理的情况,此时我们需要开辟线程,但是开辟线程的过程代价比较高。通常我们可以通过开辟线程池(ThreadPool)来实现线程,当我们需要使用线程时,我们可以根据需求来...
  • xzwykxz
  • xzwykxz
  • 2016年08月11日 13:56
  • 413

【Java高级】ThreadPool用法与优势

1. 引言 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第...
  • scboyhj__
  • scboyhj__
  • 2015年09月29日 13:47
  • 10299

boost::threadpool 调用类成员变量并传入参数 的方法

1. 首先到官网下载http://threadpool.sourceforge.net/2. 包含头文件#include "../boost/threadpool.hpp"3. 声明threadpoo...
  • muzizongheng
  • muzizongheng
  • 2013年07月10日 15:41
  • 1345

一个Python的‘Threadpool’包中的“巨坑”

Python ThreadPool 坑
  • wudifengz
  • wudifengz
  • 2017年03月30日 14:57
  • 1394

ThreadPool用法与优势

1. 引言 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第...
  • u011860731
  • u011860731
  • 2015年09月26日 09:34
  • 2593

boost扩展工具-线程池(threadpool)

boost扩展工具-线程池(threadpool): http://threadpool.sourceforge.net/下载threadpool,然后把threadpool里面的boost目录下的...
  • whymm
  • whymm
  • 2015年11月25日 19:20
  • 855

开发随笔-.net ThreadPool

这两天一直在忙支付的事情,如果说简单,无非是调用几个国外的网关接口罢了,这个方面可以看我转载的国外的技术文章:      http://blog.csdn.net/hliq5399/article/d...
  • hliq5399
  • hliq5399
  • 2012年03月12日 16:29
  • 1800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ThreadPool
举报原因:
原因补充:

(最多只允许输入30个字)