.NET并行计算和并发6-获取线程池的最大可用线程数
- using System;
- using System.IO;
- using System.Security.Permissions;
- using System.Threading;
- class Test
- {
- static void Main()
- {
- AutoResetEvent mainEvent = new AutoResetEvent(false);
- int workerThreads;
- int portThreads;
- ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
- Console.WriteLine("\nMaximum worker threads: \t{0}" +
- "\nMaximum completion port threads: {1}",
- workerThreads, portThreads);
- ThreadPool.GetAvailableThreads(out workerThreads,
- out portThreads);
- Console.WriteLine("\nAvailable worker threads: \t{0}" +
- "\nAvailable completion port threads: {1}\n",
- workerThreads, portThreads);
- ThreadPool.QueueUserWorkItem(new
- WaitCallback(ThreadPoolTest.WorkItemMethod), mainEvent);
- // Since ThreadPool threads are background threads,
- // wait for the work item to signal before ending Main.
- mainEvent.WaitOne(5000, false);
- Console.ReadLine();
- }
- }
- class ThreadPoolTest
- {
- // Maintains state information to be passed to EndWriteCallback.
- // This information allows the callback to end the asynchronous
- // write operation and signal when it is finished.
- class State
- {
- public FileStream fStream;
- public AutoResetEvent autoEvent;
- public State(FileStream fStream, AutoResetEvent autoEvent)
- {
- this.fStream = fStream;
- this.autoEvent = autoEvent;
- }
- }
- ThreadPoolTest() { }
- public static void WorkItemMethod(object mainEvent)
- {
- Console.WriteLine("\nStarting WorkItem.\n");
- AutoResetEvent autoEvent = new AutoResetEvent(false);
- // Create some data.
- const int ArraySize = 10000;
- const int BufferSize = 10000;
- byte[] byteArray = new Byte[ArraySize];
- new Random().NextBytes(byteArray);
- // Create two files and two State objects.
- FileStream fileWriter1 =
- new FileStream(@"C:\Test1@##.dat", FileMode.Create,
- FileAccess.ReadWrite, FileShare.ReadWrite,
- BufferSize, true);
- FileStream fileWriter2 =
- new FileStream(@"C:\Test2@##.dat", FileMode.Create,
- FileAccess.ReadWrite, FileShare.ReadWrite,
- BufferSize, true);
- State stateInfo1 = new State(fileWriter1, autoEvent);
- State stateInfo2 = new State(fileWriter2, autoEvent);
- // Asynchronously write to the files.
- fileWriter1.BeginWrite(byteArray, 0, byteArray.Length,
- new AsyncCallback(EndWriteCallback), stateInfo1);
- fileWriter2.BeginWrite(byteArray, 0, byteArray.Length,
- new AsyncCallback(EndWriteCallback), stateInfo2);
- // Wait for the callbacks to signal.
- autoEvent.WaitOne();
- autoEvent.WaitOne();
- fileWriter1.Close();
- fileWriter2.Close();
- Console.WriteLine("\nEnding WorkItem.\n");
- // Signal Main that the work item is finished.
- ((AutoResetEvent)mainEvent).Set();
- }
- static void EndWriteCallback(IAsyncResult asyncResult)
- {
- Console.WriteLine("Starting EndWriteCallback.");
- State stateInfo = (State)asyncResult.AsyncState;
- int workerThreads;
- int portThreads;
- try
- {
- ThreadPool.GetAvailableThreads(out workerThreads,
- out portThreads);
- Console.WriteLine("\nAvailable worker threads: \t{0}" +
- "\nAvailable completion port threads: {1}\n",
- workerThreads, portThreads);
- stateInfo.fStream.EndWrite(asyncResult);
- // Sleep so the other thread has a chance to run
- // before the current thread ends.
- //Thread.Sleep(1500);
- }
- finally
- {
- // Signal that the current thread is finished.
- stateInfo.autoEvent.Set();
- Console.WriteLine("Ending EndWriteCallback.");
- }
- }
- }
.NET并行计算和并发6-获取线程池的最大可用线程数的更多相关文章
- PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束
PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束 ExecutorService并没有提供什么 isDone()或者isComplete()之类的方法. 作者Atti ...
- 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)
目录 预备知识 源码分析 submit()源码分析 shutdownNow()源码分析 代码输出 设计目的与优点 预备知识 可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释. 1.一 ...
- InheritableThreadLocal 在线程池中进行父子线程间消息传递出现消息丢失的解析
在日常研发过程中,我们经常面临着需要在线程内,线程间进行消息传递,比如在修改一些开源组件源码的过程中,需要将外部参数透传到内部,如果进行方法参数重载,则涉及到的改动量过大,这样,我们可以依赖Threa ...
- java多线程系类:JUC线程池:03之线程池原理(二)(转)
概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...
- java多线程系类:JUC线程池:02之线程池原理(一)
在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...
- 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- 使用Callable接口创建线程和使用线程池的方式创建线程
1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...
随机推荐
- JZ2440使用笔记之熟悉uboot和Linux的移植
目录 一.点亮开发板:移植uboot.Linux内核.文件系统 1.1 配置上位机交叉编译环境 1.2 制作U-boot镜像文件 1.3 通过oflash.exe / openJTAG 烧写u-boo ...
- Linux 查看系统负载
查看系统负 # 查看系统负载 命令:uptime :: up :, users, load average: 0.00, 0.00, 0.00 注:load average: 0.00, 0.00, ...
- Kali Day01 --- arpspoof命令进行断网攻击(ARP欺骗)
root@kali:~/文档# arpspoof -i eth0 -t 172.20.151.* 172.20.151.1 34:64:a9:36:4:b7 0:0:0:0:0:0 0806 42: ...
- centos7救援模式--单机模式(单用户模式)
前序 经典问题: 单机模式, 当系统忘记某用户登录密码的时候可以解决密码重置问题 操作 1 开机的时候出现选择进入系统的界面时, 按E键 2 选择定位到ro这里, 替换成rw init=/sysroo ...
- mysql 热备份
xtrabackup mysql 的备份和恢复 1.准备 安装依赖 yum install perl-DBD-MySQL perl-Time-HiRes libaio libaio-devel -y ...
- 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码
接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...
- 网站基础html javascript jquery
第二章HTML HBuilder的使用 边改边看模式 chrome浏览器看. HTML的基本格式 超文本标记语言 HyperText Markup Language HyperText 超文本 Mar ...
- Codeforces 587 E. Duff as a Queen
题目链接:http://codeforces.com/contest/587/problem/E 其实就是线段树维护区间线性基,合并的时候注意一下.复杂度${O(nlog^{3})}$ #includ ...
- NYOJ 542 试制品(第五届河南省省赛)
解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h ...
- 温顾知新系列-JAVA网络编程系统(1)- 流
一.字节流 1. 输出流 Java的基本输出流类是java.io.OutputStream; public abstract calss OutputStream 此类常用的写入数据的基本方法如下: ...