博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈ThreadPool 线程池
阅读量:7127 次
发布时间:2019-06-28

本文共 1732 字,大约阅读时间需要 5 分钟。

相关概念:

    线程池可以看做容纳线程的容器;

    一个应用程序最多只能有一个线程池;

    ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池;

    每排入一个工作函数,就相当于请求创建一个线程;

 

线程池的作用:

线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。

如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止。

 

什么时候使用ThreadPool


 

ThreadPool 示例一 :

ExpandedBlockStart.gif
ThreadPool_1.cs
using
 System;
using
 System.Text;
using
 System.Threading;

namespace
 多线程
{

    
public
 
class
 Example
    {

        
public
 
static
 
void
 Main()
        {

            
//
 Queue the task.

            ThreadPool.QueueUserWorkItem(
new
 WaitCallback(ThreadProc));

            Console.WriteLine(
"
Main thread does some work, then sleeps.
"
);
          
            Thread.Sleep(
1000
);

            Console.WriteLine(
"
Main thread exits.
"
);
        }

        
static
 
void
 ThreadProc(Object stateInfo)
        {

            
//
 No state object was passed to QueueUserWorkItem, 
            
//
 so stateInfo is null.

            Console.WriteLine(
"
Hello from the thread pool.
"
);
        }
    }
}


ThreadPool 示例 :

ExpandedBlockStart.gif
ThreadPool_2.cs
using
 System;
using
 System.Collections.Generic;
using
 System.Text;
using
 System.Threading;

namespace
 CS_Test
{

    
class
 ThreadPool_Demo
    {

        
//
 用于保存每个线程的计算结果

        
static
 
int
[] result 
=
 
new
 
int
[
10
];


        
//
注意:由于WaitCallback委托的声明带有参数,
        
//
      所以将被调用的Fun方法必须带有参数,即:Fun(object obj)。

        
static
 
void
 Fun(
object
 obj)
        {

            
int
 n 
=
 (
int
)obj;

            
//
计算阶乘

            
int
 fac 
=
 
1
;
            
for
 (
int
 i 
=
 
1
; i 
<=
 n; i
++
)
            {

                fac 
*=
 i;
            }
            
//
保存结果

            result[n] 
=
 fac;
        }

        
static
 
void
 Main(
string
[] args)
        {

            
//
向线程池中排入9个工作线程

            
for
 (
int
 i 
=
 
1
; i 
<=
 
9
 ; i
++
)
            {

                
//
QueueUserWorkItem()方法:将工作任务排入线程池。

                ThreadPool.QueueUserWorkItem(
new
 WaitCallback(Fun),i);
                
//
 Fun 表示要执行的方法(与WaitCallback委托的声明必须一致)。
                
//
 i   为传递给Fun方法的参数(obj将接受)。

            }

            
//
输出计算结果

            
for
 (
int
 i 
=
 
1
; i 
<=
 
9
; i
++
)
            {

                Console.WriteLine(
"
线程{0}: {0}! = {1}
"
,i,result[i]);
            }
        }

    }
}


 

ThreadPool的作用:

本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html,如需转载请自行联系原作者
你可能感兴趣的文章
小米9售价揭晓!可能是最后一次了
查看>>
py2exe的安装
查看>>
vrrp
查看>>
Gson入门
查看>>
shell 命令记录
查看>>
使用OpenSessionInViewFilter解决session关闭问题
查看>>
lvs基本使用
查看>>
我的友情链接
查看>>
Liferay 用本地私服(nexus) 打包部署Portlet应用
查看>>
敏捷软件开发实践-Code Review Process
查看>>
liunx环境下的oracle安装
查看>>
手把手教你使用Newstart HA
查看>>
JAVA多线程问题【2】 synchronized锁机制
查看>>
redis 安装配置
查看>>
案例2
查看>>
手动挂载分区
查看>>
键盘通知
查看>>
构建自己的词典库
查看>>
Graph Data Structures for Beginners
查看>>
@NotNull, @NotEmpty和@NotBlank
查看>>