线程池_ThreadPool
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks; /*
* 简化多线程使用,发挥主机最大性能
*
* 网论,可以不修改最大线程数,框架会根据实时资源情况启动任务,带内存保守机制
* 经测试,8 核心时可以达到理想状态,使用 32 核心CPU时,仅发挥CPU(内存)不到50%能力
* 结论,自己取核心数-1,指定给线程池,内存不足时线程池有保护功能,目前来看不用管内存问题
* 异步读写,计算量 > 读写量时,异步数可以等于核心数,否则 。。。
*
*/ namespace 线程池_ThreadPool
{
class Program
{
static void Main(string[] args)
{
//设置最大任务数
int num = getNumber();
ThreadPool.SetMaxThreads(num, num); string[] files = new string[10000]; // 1 匿名函数
for (int i = 0; i < files.Length; i++)
{
string filePath = files[i];
ThreadPool.QueueUserWorkItem((object sender) =>
{
//using (Bitmap map = new Bitmap(filePath))
//{
// BitmapData bmpData = map.LockBits(new Rectangle(Point.Empty, map.Size),
// ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
// byte[] buffer = new byte[bmpData.Stride * bmpData.Height];
// Marshal.Copy(bmpData.Scan0, buffer, 0, buffer.Length);
// // do something at this map...
// Marshal.Copy(buffer, 0, bmpData.Scan0, buffer.Length);
// map.UnlockBits(bmpData);
// map.Save(filePath);
// map.Dispose();
//}
//GC.Collect();
});
} // 2 调外部函数
for (int i = 0; i < files.Length; i++)
{
ThreadPool.QueueUserWorkItem(work, files[i]);
}
} static void work(object sender)
{
string filePath = sender.ToString();
using (Bitmap map = new Bitmap(filePath))
{
BitmapData bmpData = map.LockBits(new Rectangle(Point.Empty, map.Size),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte[] buffer = new byte[bmpData.Stride * bmpData.Height];
Marshal.Copy(bmpData.Scan0, buffer, 0, buffer.Length);
// do something at this map...
Marshal.Copy(buffer, 0, bmpData.Scan0, buffer.Length);
map.UnlockBits(bmpData);
map.Save(filePath);
map.Dispose();
}
GC.Collect();
}
/// <summary>
/// 获取核心数
/// </summary>
/// <returns></returns>
static int getNumber()
{
ManagementObjectCollection cpus = new ManagementClass("Win32_Processor").GetInstances();
int num = -1;
foreach (var cpu in cpus)
{
num += Convert.ToInt32(cpu.Properties["NumberOfLogicalProcessors"].Value);
}
return num;
}
}
}
线程池_ThreadPool的更多相关文章
- C++面向对象实现封装线程池
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- NGINX引入线程池 性能提升9倍
1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
随机推荐
- 深度探索C++对象模型读书笔记-第六章执行期语意学
在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...
- top.location.href
window.location.href.location.href是本页面跳转 parent.location.href是上一层页面跳转 top.location.href是最外层的页面跳转 ...
- Servlet - Tomcat服务器相关
1. 服务器 : 服务器其实就是代码编写的一个程序, 可以根据用户发送的请求, 调用执行对应的逻辑代码 2. Tomcat目录结构说明 : \bin : 存放启动和关闭Tomcat的可执行文件 \co ...
- LUOGU P1501 [国家集训队]Tree II (lct)
传送门 解题思路 \(lct\),比较模板的一道题,路径加和乘的维护标记与线段树\(2\)差不多,然后剩下就没啥了.但调了我将近一下午.. 代码 #include<iostream> #i ...
- OpenSceneGraph | OSG如何存储带纹理osgb格式可以节省空间
在使用OSG(OpenSceneGraph)存储带纹理osgb格式的过程中,大家会遇到这样一种情况:存储后的osgb文件所占用的大小远大于原始文件的大小,几倍至几十倍.这是为何呢?原因是OSG默认 ...
- NX二次开发-UFUN特征选择对话框UF_UI_select_feature
#include <uf.h> #include <uf_ui.h> UF_initialize(); //特征选择对话框 char sMessage[] = "特征 ...
- vue webpack打包后.css文件里面的背景图片路径错误解决方法
资源相对引用路径 问题描述 一般情况下,通过webpack+vuecli默认打包的css.js等资源,路径都是绝对的. 但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static ...
- 20140316 window live write 插件 推荐代码高亮插件 构造函数只能用初始化成员列表方式的例子
1.window live write 插件:http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 2.推荐代码高亮插件:W ...
- boost库之pool编译错误
1,编译错误截图 2,解决方法 这是由于没有链接对应的库导致的错误,在编译命令中加上 -lboost_system选项即可.
- Hadoop搭建,上传文件时出现错误,没有到主机的路由
解决方案:(1)从namenode主机ping其它slaves节点的主机名(注意是slaves节点的主机名),如果ping不通,原因可能是namenode节点的/etc/hosts 未配置主机名与IP ...