浅谈ThreadPool 线程池

简介:

相关概念:

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

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

    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,如需转载请自行联系原作者

相关文章
|
22天前
|
缓存 监控 Java
高并发编程之ThreadPool 线程池
高并发编程之ThreadPool 线程池
26 1
|
4月前
|
Java 调度
Java多线程:什么是线程池(ThreadPool)?
Java多线程:什么是线程池(ThreadPool)?
48 0
|
1月前
|
存储 Java 开发者
为什么建议不要使用Executors来创建线程池?
为什么建议不要使用Executors来创建线程池?
15 0
|
4月前
|
缓存 搜索推荐 Java
线程池之ThreadPoolExecutor
线程池之ThreadPoolExecutor
43 0
|
分布式计算 Java 大数据
ForkJoinPool线程池
ForkJoinPool线程池
|
安全
线程池中CompletionService的应用
线程池中CompletionService的应用
91 0
|
存储 Java 应用服务中间件
让人思来想去的ThreadPool
一直以来被一个线程池中核心线程跟非核心线程有什么区别的问题困惑着自己,是时候直面恐惧了。
140 0
|
缓存 Java
为什么线程池不允许使用Executors去创建?
Executors Executors存在什么问题 Executors为什么会OOM 创建线程池的正确姿势
为什么线程池不允许使用Executors去创建?
线程池之ThreadPoolExecutor使用
通过自定义线程池,我们可以更好的让线程池为我们所用,更加适应我的实际场景
|
Java .NET 开发框架
ThreadPool类(线程池)
原文:ThreadPool类(线程池) CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程。线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,但是在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。
1078 0