1. using System;
  2. using System.IO;
  3. using System.Security.Permissions;
  4. using System.Threading;
  5.  
  6. class Test
  7. {
  8. static void Main()
  9. {
  10. AutoResetEvent mainEvent = new AutoResetEvent(false);
  11. int workerThreads;
  12. int portThreads;
  13.  
  14. ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
  15. Console.WriteLine("\nMaximum worker threads: \t{0}" +
  16. "\nMaximum completion port threads: {1}",
  17. workerThreads, portThreads);
  18.  
  19. ThreadPool.GetAvailableThreads(out workerThreads,
  20. out portThreads);
  21. Console.WriteLine("\nAvailable worker threads: \t{0}" +
  22. "\nAvailable completion port threads: {1}\n",
  23. workerThreads, portThreads);
  24.  
  25. ThreadPool.QueueUserWorkItem(new
  26. WaitCallback(ThreadPoolTest.WorkItemMethod), mainEvent);
  27.  
  28. // Since ThreadPool threads are background threads,
  29. // wait for the work item to signal before ending Main.
  30. mainEvent.WaitOne(5000, false);
  31. Console.ReadLine();
  32. }
  33. }
  34.  
  35. class ThreadPoolTest
  36. {
  37. // Maintains state information to be passed to EndWriteCallback.
  38. // This information allows the callback to end the asynchronous
  39. // write operation and signal when it is finished.
  40. class State
  41. {
  42. public FileStream fStream;
  43. public AutoResetEvent autoEvent;
  44.  
  45. public State(FileStream fStream, AutoResetEvent autoEvent)
  46. {
  47. this.fStream = fStream;
  48. this.autoEvent = autoEvent;
  49. }
  50. }
  51.  
  52. ThreadPoolTest() { }
  53.  
  54. public static void WorkItemMethod(object mainEvent)
  55. {
  56. Console.WriteLine("\nStarting WorkItem.\n");
  57. AutoResetEvent autoEvent = new AutoResetEvent(false);
  58.  
  59. // Create some data.
  60. const int ArraySize = 10000;
  61. const int BufferSize = 10000;
  62. byte[] byteArray = new Byte[ArraySize];
  63. new Random().NextBytes(byteArray);
  64.  
  65. // Create two files and two State objects.
  66. FileStream fileWriter1 =
  67. new FileStream(@"C:\Test1@##.dat", FileMode.Create,
  68. FileAccess.ReadWrite, FileShare.ReadWrite,
  69. BufferSize, true);
  70. FileStream fileWriter2 =
  71. new FileStream(@"C:\Test2@##.dat", FileMode.Create,
  72. FileAccess.ReadWrite, FileShare.ReadWrite,
  73. BufferSize, true);
  74. State stateInfo1 = new State(fileWriter1, autoEvent);
  75. State stateInfo2 = new State(fileWriter2, autoEvent);
  76.  
  77. // Asynchronously write to the files.
  78. fileWriter1.BeginWrite(byteArray, 0, byteArray.Length,
  79. new AsyncCallback(EndWriteCallback), stateInfo1);
  80. fileWriter2.BeginWrite(byteArray, 0, byteArray.Length,
  81. new AsyncCallback(EndWriteCallback), stateInfo2);
  82.  
  83. // Wait for the callbacks to signal.
  84. autoEvent.WaitOne();
  85. autoEvent.WaitOne();
  86.  
  87. fileWriter1.Close();
  88. fileWriter2.Close();
  89. Console.WriteLine("\nEnding WorkItem.\n");
  90.  
  91. // Signal Main that the work item is finished.
  92. ((AutoResetEvent)mainEvent).Set();
  93. }
  94.  
  95. static void EndWriteCallback(IAsyncResult asyncResult)
  96. {
  97. Console.WriteLine("Starting EndWriteCallback.");
  98.  
  99. State stateInfo = (State)asyncResult.AsyncState;
  100. int workerThreads;
  101. int portThreads;
  102. try
  103. {
  104. ThreadPool.GetAvailableThreads(out workerThreads,
  105. out portThreads);
  106. Console.WriteLine("\nAvailable worker threads: \t{0}" +
  107. "\nAvailable completion port threads: {1}\n",
  108. workerThreads, portThreads);
  109.  
  110. stateInfo.fStream.EndWrite(asyncResult);
  111.  
  112. // Sleep so the other thread has a chance to run
  113. // before the current thread ends.
  114. //Thread.Sleep(1500);
  115. }
  116. finally
  117. {
  118. // Signal that the current thread is finished.
  119. stateInfo.autoEvent.Set();
  120. Console.WriteLine("Ending EndWriteCallback.");
  121. }
  122. }
  123. }

.NET并行计算和并发6-获取线程池的最大可用线程数的更多相关文章

  1. PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束

    PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束 ExecutorService并没有提供什么 isDone()或者isComplete()之类的方法. 作者Atti ...

  2. 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)

    任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...

  3. java多线程、线程池及Spring配置线程池详解

    1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...

  4. 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)

    目录 预备知识 源码分析 submit()源码分析 shutdownNow()源码分析 代码输出 设计目的与优点 预备知识 可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释. 1.一 ...

  5. InheritableThreadLocal 在线程池中进行父子线程间消息传递出现消息丢失的解析

    在日常研发过程中,我们经常面临着需要在线程内,线程间进行消息传递,比如在修改一些开源组件源码的过程中,需要将外部参数透传到内部,如果进行方法参数重载,则涉及到的改动量过大,这样,我们可以依赖Threa ...

  6. java多线程系类:JUC线程池:03之线程池原理(二)(转)

    概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...

  7. java多线程系类:JUC线程池:02之线程池原理(一)

    在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...

  8. 线程池 异步I/O线程 <第三篇>

    在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...

  9. 使用Callable接口创建线程和使用线程池的方式创建线程

    1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...

随机推荐

  1. JZ2440使用笔记之熟悉uboot和Linux的移植

    目录 一.点亮开发板:移植uboot.Linux内核.文件系统 1.1 配置上位机交叉编译环境 1.2 制作U-boot镜像文件 1.3 通过oflash.exe / openJTAG 烧写u-boo ...

  2. Linux 查看系统负载

    查看系统负 # 查看系统负载 命令:uptime :: up :, users, load average: 0.00, 0.00, 0.00 注:load average: 0.00, 0.00, ...

  3. 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: ...

  4. centos7救援模式--单机模式(单用户模式)

    前序 经典问题: 单机模式, 当系统忘记某用户登录密码的时候可以解决密码重置问题 操作 1 开机的时候出现选择进入系统的界面时, 按E键 2 选择定位到ro这里, 替换成rw init=/sysroo ...

  5. mysql 热备份

    xtrabackup mysql 的备份和恢复 1.准备 安装依赖 yum install perl-DBD-MySQL perl-Time-HiRes libaio libaio-devel -y ...

  6. 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码

    接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...

  7. 网站基础html javascript jquery

    第二章HTML HBuilder的使用 边改边看模式 chrome浏览器看. HTML的基本格式 超文本标记语言 HyperText Markup Language HyperText 超文本 Mar ...

  8. Codeforces 587 E. Duff as a Queen

    题目链接:http://codeforces.com/contest/587/problem/E 其实就是线段树维护区间线性基,合并的时候注意一下.复杂度${O(nlog^{3})}$ #includ ...

  9. NYOJ 542 试制品(第五届河南省省赛)

    解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h ...

  10. 温顾知新系列-JAVA网络编程系统(1)- 流

    一.字节流 1. 输出流 Java的基本输出流类是java.io.OutputStream; public abstract calss OutputStream 此类常用的写入数据的基本方法如下: ...