线程Thread为我们同时处理多个任务提供了便利。但是问题又来了。当遇到以下问题时:

1.当程序有不确定的多个小的任务时,我们无法事先确定要定义多少个Thread。

2.当有新任务执行时,希望线程能够相应执行;当线程完成自己的任务时,能够释放相关资源并且线程数量进行相关减少。(换句话说,能够更加智能的控制线程数量)。

其实,不必担心,已经有了解决方法。即使用ThreadPool类。

先贴一个简单的例子:

View Code

using System;using System.Collections.Generic;using System.Text;using System.Threading;

namespace ThreadTest{class Program    {static void Main(string[] args)        {int nWorkerThreads;int nCompletionProtThreads;            ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionProtThreads);            Console.WriteLine(" 线程池中辅助线程的最大数目:{0};线程池中异步 I/O 线程的最大数目:{1} ", nWorkerThreads, nCompletionProtThreads);            Console.ReadLine();

for (int i = 0; i < 5; i++)            {                ThreadPool.QueueUserWorkItem(JobForThread);// 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行            }            Thread.Sleep(3000);            Console.ReadLine();

        }

/// <summary>/// 线程池中,每个线程要执行的操作/// </summary>/// <param name="state"></param>        static void JobForThread(object state)        {for (int i = 1; i <= 3; i++)            {                Console.WriteLine(" 循环遍数 {0},当前托管线程的唯一标识符: {1} ", i, Thread.CurrentThread.ManagedThreadId);                Thread.Sleep(1000);            }        }

    }}

运行结果:

首先,输出了当前线程池中的可用线程的总数量,然后输出了,I/O线程的总数量。

双核系统中,默认的线程池中辅助线程的最大数目:1023;线程池中异步 I/O 线程的最大数目:1000 。

点击回车

其次,输出线程池中每个线程执行的相关任务。由于是多线程,线程采用抢占方式执行,运行的结果不会相同。

讲解:

1.ThreadPool.QueueUserWorkItem(JobForThread);该方法,的作用是:将方法排入队列以便执行。此方法在有线程池线程变得可用时执行

这样,当线程池中,有空闲的线程时,就会执行static void JobForThread(object state); 方法。在该方法中,会循环3次,并且答应当前执行线程的ID。

2.public static bool QueueUserWorkItem(WaitCallback callBack);方法。

public static bool QueueUserWorkItem(WaitCallback callBack);该方法作用是:将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。WaitCallback 方法的签名:public delegate void WaitCallback(object state);可见,从该委托的签名中,我们可以知道,该委托需要返回值为void,并且参数为object的方法。所以,我们将static void JobForThread(object state)方法赋予该委托。

注意:

1.线程池中的所有线程都是后台线程。当程序进程停止了,线程池中的所有线程也会停止。不能把线程池中的线程改变为前台线程。

2.不能给线程池中的线程设置优先级和线程名称。

3.线程池中的线程,应该执行较短小的任务。如果需要较长时间执行的任务,应该用Thread来进行。

线程池技术比较简单,您现在应该了解了吧?!

希望能为您带来帮助,谢谢!

转载于:https://www.cnblogs.com/zhangzhensoft/archive/2012/01/16/2323382.html

Thread 线程基础之-线程池ThreadPool一相关推荐

  1. Thread 线程基础之-线程相关知识

    线程的优先级 设置或者获得当前线程的优先级: using System;using System.Collections.Generic;using System.Text;using System. ...

  2. java 线程 操作系统线程_线程基础:线程(1)——操作系统和线程原理

    1.概述 我在写"系统间通信技术专栏"的时候,收到很多读者的反馈.其中有一部分读者希望我抽空写一写自己关于对Java线程的使用经验和总结.巧的是,这个月我所在的技术团队也有很多同事 ...

  3. java线程基础巩固---线程生命周期以及start方法源码剖析

    上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...

  4. 多线程与高并发(一):单机高并发应该掌握的线程基础:线程状态,异常与锁等

    多线程复习 多线程的基本概念 什么是一个线程?如何开启一个线程? package com.mashibing.juc.c_000;import java.util.concurrent.TimeUni ...

  5. linux线程基础篇----线程同步与互斥

    linux线程基础----线程同步与互斥 一.同步的概念 1.同步概念  所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两个设备   ...

  6. Java基础 - 坦克大战(第三章,线程基础与线程使用)

    文章目录 本章内容 - 多线程处理 绘制敌方坦克 线程基础 线程相关概念 程序(program) 进程 什么是线程 其他相关概念 单线程 多线程 并发 并行 获取当前电脑处理器(cpu)个数 Java ...

  7. Java中的线程基础篇-线程基本概念

    线程的概念.创建方式.生命周期.优缺点 一.基础知识 1. 进程.线程.协程 1.1 进程 1.2 线程 1.3 协程 2. 串行.并发.并行 2.1 串行 2.2 并发 2.3 并行 二.线程的创建 ...

  8. 线程基础篇-线程同步

    Lock是将一段代码定义为临界区,临界区中的代码在同一时刻只能有一个线程访问,当临界区代码执行时,其他线程调用会被阻塞,需等待资源释放. 语法: private object locker=new o ...

  9. Java线程基础(5): 线程状态之 Runnable

    目录 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? 在上一篇我们粗略谈到了 Java 的6种线程状态,并对 ...

  10. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

最新文章

  1. DataGrid在分页状态下删除纪录的问题
  2. Linux基础第一周
  3. vuex是什么?怎么用,例子
  4. 【Python基础入门系列】第10天:Python 类与对象
  5. mysql授权远程访问
  6. C#中,将16进制转换为有符号的10进制的方法(支持带0x标志,支持任意字符串)
  7. CCNA新版教程笔记 (一)
  8. 快鲸六大私域运营服务,赋能企业业绩长效增长
  9. Opencascade TopoDS_Shape Orientation
  10. 【ARM开发】交叉编译Qt源码之(1)编译xcb
  11. 1113 小胖子的时钟【水题】
  12. 《抡语》 kong子 (收集)
  13. Hadoop生态系统功能组件,主要包括哪些?
  14. NoSQL与SQL:选择数据管理解决方案
  15. openmeetings 安装ssl
  16. k8s docker mysql_K8s——MySQL实现数据持久化
  17. 计算机管理内默认共享,善用“默认共享”便于管理。解决“这个共享是为管理而创建的。服务器服务停止并重新启动后或计算机重新...
  18. (每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃
  19. Python爬虫案例:批量下载超清画质手机壁纸
  20. WIN7安装VISIO 错误1406 安装程序无法将值 写入注册表项解决办法

热门文章

  1. django 外键_Django 文档解读 - 模型层(1)
  2. [渝粤教育] 广东-国家-开放大学21秋期末考试大学英语210262k2
  3. 【渝粤教育】国家开放大学2018年春季 0554-22T立体构成(一) 参考试题
  4. 【渝粤教育】国家开放大学2018年秋季 0363-21T市场调查与预测 参考试题
  5. Google专卖店顾客消费预测问题:如何将数据的json格式转换成csv格式
  6. Swift 枚举的用法
  7. oracle存储过程(带参数的存储过程)
  8. windows环境下使用virtualenv对python进行多版本隔离
  9. st.getParameter() 和request.getAttribute() 区别 https://terryjs.iteye.com/blog/1317610
  10. 使用opencv-python画OpenCV LOGO