.Net多线程程序设计学习笔记----创建托管线程和访问OS线程
来源:互联网 发布:京东淘宝网购物商城 编辑:程序博客网 时间:2024/04/29 23:24
多线程是提高应用程序响应灵敏度的常用方式,我们通常将需要花费大量时间的计算任务放到后台线程中去执行,这样用户界面就可以继续接收用户的命令.而不需要等待任务的结束.但是在单处理器的系统中,太多的线程反而会降低系统的性能,因为系统需要更多的时间来进行线程的切换.下面主要介绍一下:在.net 中创建托管线程和访问OS线程信息的方法;异步委托调用的实现;线程同步.
一.在.net 中创建托管线程和访问OS线程信息的方法
在.NET中通过System.Threading.Thread类来表示托管线程.一个托管线程不对应于一个系统线程,它是CLR的逻辑线程有CLR来维护线程信息.托管线程有两种类型:线程池线程和非线程池线程.下面非别介绍一下各种线程的创建方法:
1.线程池线程:线程池为我们提供了大量的可利用的线程资源,线程的使用可以大大减少我们申请新的线程资源的之间.我们可以通过ThreadPool.QueueUserWorkItem(WaitCallBack);来向线程池中添加线程.如下:
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
WaitCallback thread = new WaitCallback(ThreadPro);
ThreadPool.QueueUserWorkItem(thread, "Thread:");
Console.ReadLine();
}
static void ThreadPro(object stateInfo)
{
Console.WriteLine(stateInfo.ToString());
}
}
}
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
WaitCallback thread = new WaitCallback(ThreadPro);
ThreadPool.QueueUserWorkItem(thread, "Thread:");
Console.ReadLine();
}
static void ThreadPro(object stateInfo)
{
Console.WriteLine(stateInfo.ToString());
}
}
}
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//显示可容纳的工作线程和异步IO线程
int maxWorkThread, maxCompletionThread;
ThreadPool.GetMaxThreads(out maxWorkThread, out maxCompletionThread);
Console.WriteLine("maxWorkThread={0};maxCompletionThread={1}",maxWorkThread, maxCompletionThread);
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//显示可容纳的工作线程和异步IO线程
int maxWorkThread, maxCompletionThread;
ThreadPool.GetMaxThreads(out maxWorkThread, out maxCompletionThread);
Console.WriteLine("maxWorkThread={0};maxCompletionThread={1}",maxWorkThread, maxCompletionThread);
//创建100个线程池线程
Console.WriteLine("stateInfo 在线程池中的标识 当前可用的线程");
for (int i = 0; i < 100; i++)
{
WaitCallback thread = new WaitCallback(ThreadPro);
ThreadPool.QueueUserWorkItem(thread, "Thread:"+i);
}
Console.Read();
}
//线程执行入口,显示线程信息 "stateInfo 在线程池中的标识 当前可用的线程"
static void ThreadPro(object stateInfo)
{
Random r = new Random();
int available, total;
ThreadPool.GetAvailableThreads(out available, out total);
Console.WriteLine("{0} {1} {2} ",stateInfo.ToString(),Thread.CurrentThread.ManagedThreadId,available);
Thread.Sleep(r.Next(5000,10000));
}
}
}
Console.WriteLine("stateInfo 在线程池中的标识 当前可用的线程");
for (int i = 0; i < 100; i++)
{
WaitCallback thread = new WaitCallback(ThreadPro);
ThreadPool.QueueUserWorkItem(thread, "Thread:"+i);
}
Console.Read();
}
//线程执行入口,显示线程信息 "stateInfo 在线程池中的标识 当前可用的线程"
static void ThreadPro(object stateInfo)
{
Random r = new Random();
int available, total;
ThreadPool.GetAvailableThreads(out available, out total);
Console.WriteLine("{0} {1} {2} ",stateInfo.ToString(),Thread.CurrentThread.ManagedThreadId,available);
Thread.Sleep(r.Next(5000,10000));
}
}
}
2.非线程池线程;我们可以通过System.Threading.Thread来显示的创建一个非线程池线程,这样我们可以直接控制线程的行为.
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ParameterizedThreadStart parameterizedThreadStart=new ParameterizedThreadStart(ThreadPro);
Thread thread = new Thread(parameterizedThreadStart);
thread.Start("thread");
Console.Read();
}
//线程执行入口,显示线程信息 "stateInfo 后台线程 线程池线程"
static void ThreadPro(object stateInfo)
{
Random r = new Random();
Console.WriteLine("{0} {1} {2} ",stateInfo.ToString(),
Thread.CurrentThread.IsBackground,Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(r.Next(5000,10000));
}
}
}
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ParameterizedThreadStart parameterizedThreadStart=new ParameterizedThreadStart(ThreadPro);
Thread thread = new Thread(parameterizedThreadStart);
thread.Start("thread");
Console.Read();
}
//线程执行入口,显示线程信息 "stateInfo 后台线程 线程池线程"
static void ThreadPro(object stateInfo)
{
Random r = new Random();
Console.WriteLine("{0} {1} {2} ",stateInfo.ToString(),
Thread.CurrentThread.IsBackground,Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(r.Next(5000,10000));
}
}
}
3.访问非托管线程信息:System.Diagnostics.ProcessThread表示一个非托管线程.
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//列举出当前系统的所有运行进程和它包含的线程
Process[] processes=Process.GetProcesses();
foreach (Process pro in processes)
{
Console.WriteLine("Process Name:{0},Process ID {1},ThreadCount:{2}", pro.ProcessName, pro.Id,pro.Threads.Count);
foreach (ProcessThread processThread in pro.Threads)
{
Console.WriteLine(" Thread ID:{0},STATE:{1}", processThread.Id, processThread.ThreadState);
}
}
Console.Read();
}
}
}
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//列举出当前系统的所有运行进程和它包含的线程
Process[] processes=Process.GetProcesses();
foreach (Process pro in processes)
{
Console.WriteLine("Process Name:{0},Process ID {1},ThreadCount:{2}", pro.ProcessName, pro.Id,pro.Threads.Count);
foreach (ProcessThread processThread in pro.Threads)
{
Console.WriteLine(" Thread ID:{0},STATE:{1}", processThread.Id, processThread.ThreadState);
}
}
Console.Read();
}
}
}
- .Net多线程程序设计学习笔记----创建托管线程和访问OS线程
- asp.net 创建和终止线程(多线程)
- 多线程学习笔记---->如何创建一个线程
- 多线程学习笔记---->如何创建一个线程
- VB.net创建线程、多线程和破坏线程
- Win 32 多线程程序设计学习笔记之二:线程
- Win 32 多线程程序设计学习笔记之五:终止线程
- 学习《POSIX多线程程序设计》笔记一(分离线程)
- TCP程序设计(单线程服务器和多线程服务器学习)
- 多线程学习1-创建线程
- 多线程02:《疯狂Java讲义》学习笔记——线程的创建和启动
- UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程
- iOS多线程学习笔记之二:线程创建与启动
- java多线程编程学习笔记---线程的创建
- 多线程学习笔记1-概念、创建、互斥锁、线程间通信
- .net多线程学习笔记 3 线程间同步
- 多线程学习笔记 线程基础
- linux多线程学习(二)—线程的创建和退出
- 造物弄人~这一辈子这么折腾到底为了什么?
- jsp分页-封装
- 挑选适任的人才
- 一些常见的SQL Server扩展存储过程
- 使用ant发布war包build.xml的配置.
- .Net多线程程序设计学习笔记----创建托管线程和访问OS线程
- Get Mac Address in Java
- CIO的新难题: 认清SOA使用中的五大隐患
- [翻译]辉煌帝传说 第三章 生命之树(6)下
- 今天是ERP试行前3天
- 好吧,既然有人想看坑,那我就上坑了……
- 继续上坑 坑之二 乱码(1)
- 中文域名博弈,CNNIC终成赢家
- 网站收藏