C# 线程池和编程实例
C# 线程池和编程实例
一
线程池可以看做容纳线程的容器;
一个应用程序最多只能有一个线程池;
ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池;
每排入一个工作函数,就相当于请求创建一个线程;
线程池的作用:
线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止。
你可以通过 System.Threading 名称空间的 Thread Pool 类 来使用线程池,如果你查看一下这个类,就会发现所有的成员都是静态的,而且没有公开的构造函数。这是有理由这样做的,因为每个进程只有一个线程池,并且我 们不能创建新的。这个限制的目的是为了把所有的异步编程技术都集中到同一个池中。所以我们不能拥有一个通过第三方组建创建的无法管理的线程池。
二 实例
程序运行结果截图;
码码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
//public delegate void WaitCallback(Object state);
namespace ThreadPool1
{
public partial class Form1 : Form
{
static double number1 = -1;
static double number2 = -1;
// 函数变量值
int x = 18808;
public Form1()
{
InitializeComponent();
}
void Draw1(string str1, int xPos = 0, int yPos = 0)
{
SolidBrush aBrush = new SolidBrush(Color.Blue);
Font aFont = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Millimeter);
Graphics graphic = this.CreateGraphics();
graphic.DrawString(str1, aFont, aBrush, xPos, yPos);
}
void ClsFrm()
{
Graphics graphic = this.CreateGraphics();
graphic.Clear(this.BackColor);
}
private void button1_Click(object sender, EventArgs e)
{
int maxThreadNum, portThreadNum;
int minThreadNum;
ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
ClsFrm();
Draw1("最大线程数:" + maxThreadNum.ToString(), 100, 100);
Draw1("最小空闲线程数:" + minThreadNum.ToString(), 100, 130);
}
private void button2_Click(object sender, EventArgs e)
{
// 启动第一个任务:计算x的8次方
ClsFrm();
Draw1("启动第一个任务:计算18808的8次方。", 100, 100);
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
}
private void button3_Click(object sender, EventArgs e)
{
// 启动第二个任务:计算x的8次方根
ClsFrm();
Draw1("启动第二个任务:计算18808的8次方根。", 100, 100);
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
}
private void button4_Click(object sender, EventArgs e)
{
// 等待,直到两个数值都完成计算
while (number1 == -1 || number2 == -1) ;
// 打印计算结果
ClsFrm();
Draw1(number1.ToString() + " " + number2.ToString(), 100, 100);
}
// 启动第一个任务:计算x的8次方
static void TaskProc1(object o)
{
number1 = Math.Pow(Convert.ToDouble(o), 8);
}
// 启动第二个任务:计算x的8次方根
static void TaskProc2(object o)
{
number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);
}
}
}
代码要点:
引入命名空间:using System.Threading;
这两个函数偶自制,用于在窗体上显示内容和清除显示;
void Draw1(string str1, int xPos = 0, int yPos = 0)
void ClsFrm()
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
TaskProc1是线程的执行函数,
ThreadPool.QueueUserWorkItem 方法:
将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(
WaitCallback callBack,
Object state
)
参数:
callBack 类型:System.Threading.WaitCallback WaitCallback ,它表示要执行的方法。
state 类型:System.Object 包含方法所用数据的对象。
返回值 类型:System.Boolean 如果此方法成功排队,则为 true;如果无法将该工作项排队,则引发 NotSupportedException。
C# 线程池和编程实例相关推荐
- 最新天猫面试题(含总结):线程池+并发编程+分布式设计+中间件
最新天猫面试题(含总结):线程池+并发编程+分布式设计+中间件 https://my.oschina.net/u/3892...
- 【python爬虫学习记录 持续更新】多线程多进程,带线程池爬取实例
文章目录 简介 多线程codingFrame 多进程codingFrame 线程池与进程池 线程池爬取实例(主页url隐了 主要看思路 和如何使用线程池框架) 简介 进程是资源单位 线程是执行单位 每 ...
- Java线程池原理与实例详解
Wiki 采用new Thread的方式产生多线程,可能有以下一些问题: 线程的创建和销毁开销很大,尤其是有些线程的存在时间较短: 线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...
- 最新天猫Java面试题(含总结):线程池+并发编程+分布式设计+中间件
一面: HashMap实现原理,ConcurrentHashMap实现原理 红黑树,为什么允许局部不平衡 TCP,UDP区别,为什么可靠和不可靠 一次HTTP请求的全过程,包括域名解析.定位主机等 T ...
- Java线程池ThreadPoolExecutor的实例
Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...
- C# 实现单线程线程池并调用实例
2019独角兽企业重金招聘Python工程师标准>>> using System; using System.Collections.Generic; using System.Te ...
- java基础进阶(文件列表,线程,线程组)编程实例(4篇)
此处刊登代码均测试通过,完全准确! import java.io.*; public class DirList{ public static void main(String[] args){ tr ...
- Java高并发编程:线程池
这里首先介绍了java5中的并发的小工具包:java.util.concurrent.atomic,然后介绍了线程池的概念,对使用java5的方式创建不同形式的线程进行了演示,之后介绍了两个 对象:C ...
- Java并发编程:4种线程池和缓冲队列BlockingQueue
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...
最新文章
- jsp空间流量是怎么计算的?
- 格式android id,android 获取APP的唯一标识applicationId的实例
- c#_winform打开关闭时淡入淡出
- Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
- Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热
- Android开发之RecyclerView嵌套ListView自动计算高度的方法
- Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)
- deepin安装bochs2.6.2_2.kafka安装与使用
- c#如何实现IComparable接口
- 深入理解java虚拟机读书笔记(三)
- TCS2010(中国标准编写模板)安装教程+解决三级标题条无法设置
- 数据恢复软件性能大比拼
- 使用Ruffle搭建运行Flash的网页
- mac u盘重装系统(monterey)
- 什么杀毒软件最好|什么杀毒软件好用
- 用基带等效的方式仿真8-DPSK载波调制信号在AWGN信道下的误码率和误比特率,并与理论值相比较。
- EDA 电子设计自动化VHDL系列课程8 – 脉冲信号发生器
- goodFeaturesToTrack——Shi-Tomasi角点检测
- 电脑现在找不到驱动器,设备管理器显示DVD/CD-ROM驱动器是黄色感叹号
- Eclipse官网下载
热门文章
- 99. 恢复二叉搜索树
- Work From Anywhere
- 标签页使用及bug解决
- CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
- Python 相对路径、绝对路径的写法实例演示
- Windows 技巧篇-通过“控制面板-程序和附件“查看程序安装位置实例演示
- PyQt5 技术篇 - 按钮隐藏并保留位置,pyqt5设置按钮的可见度,设置按钮透明度
- 电磁场与电磁波第四章 时变电磁场
- YTU 1495 蛇行矩阵 YTU 1607 字符棱形YTU 1959 图案打印YTU 2016 打印金字塔
- 1.1 基本图像导入、处理和导出