一. Thread多线程

  1. 两种使用方式

  通过F12查看Thread后,发现有两类构造函数,ParameterizedThreadStart和ThreadStart,其中

    ThreadStart:无参无返回值的委托

    ParameterizedThreadStart:无返回值,但是有一个object类型参数的委托

下面Thread的使用都是围绕上面这两个构造函数来进行的。

方式一:(当委托是无参数,但赋值的方法又是有参数的,可以使用这种方式转换)

当只有一行的时候,可以省略{},实际上和下面一个道理

            {
ThreadStart tStart = () => TestThread("参数1", "参数2");
//ThreadStart tStart2 = () =>
//{
// TestThread("参数1", "参数2");
//};
Thread thread = new Thread(tStart);
thread.Start();
}

方式二:(当委托是有一个object参数的时候, 如果赋值的方法不是只有一个参数,将不适用与该委托)不推荐这种方式,存在拆箱和装箱问题,效率低

             {
ParameterizedThreadStart pStart = t => TestThread2(t.ToString());
//ParameterizedThreadStart pStart2 = (t) => TestThread2(t.ToString());
//ParameterizedThreadStart pStart3 = (t) =>
//{
// TestThread2(t.ToString());
//};
Thread thread = new Thread(pStart);
thread.Start("参数1");
}

 2. 利用Join方法进行线程等待

  {
List<Thread> list = new List<Thread>();
for (int i = ; i < ; i++)
{
string name1 = string.Format("ypf1-{0}", i);
string name2 = string.Format("ypf2-{0}", i);
ThreadStart tStart = () => TestThread(name1, name2);
Thread thread = new Thread(tStart);
list.Add(thread);
thread.Start();
}
//线程等待
foreach (var item in list)
{
item.Join();
}
}

 3. 补充:可以利用IsBackground设置是否为后台线程

二. ThreadPool多线程

1. 使用方式

ThreadPool开启线程唯一的方式就是 ThreadPool.QueueUserWorkItem() ,QueueUserWorkItem的参数为WaitCallback,WaitCallback为有一个object类型参数的无返回值的委托,那么该委托将怎么应对,无参数函数、一个参数的函数、多个参数的函数。

         //1. 没有参数
{
WaitCallback wcl = t => TestThread3();
ThreadPool.QueueUserWorkItem(wcl);
}
//2. 一个参数
{
WaitCallback wcl = t => TestThread2(t.ToString());
ThreadPool.QueueUserWorkItem(wcl, "测试参数1");
}
//3. 两个参数
{
//因为WaitCallback委托没法结束有两个参数的方法,这里我们采用将方法封装到类中的方式解决
MyTest<string, string> model = new MyTest<string, string>("测试参数1", "测试参数2");
WaitCallback wcl = (t) =>
{
model.TestThread();
};
ThreadPool.QueueUserWorkItem(wcl);
}
  public class MyTest<T,M>
{
public T msg1 { get; set; }
public M msg2 { get; set; }
public MyTest(T t1,M m1)
{
this.msg1 = t1;
this.msg2 = m1;
}
public void TestThread()
{
Console.WriteLine("线程开始:测试参数为:{0}和{1},当前线程的id为:{2}", msg1, msg2, System.Threading.Thread.CurrentThread.ManagedThreadId);
long sum = ;
for (int i = ; i < ; i++)
{
sum += i;
}
Console.WriteLine("线程结束:测试参数为:{0}和{1},当前线程的id为:{2}", msg1, msg2, System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}

  2. 多线程等待

        List<ManualResetEvent> list = new List<ManualResetEvent>();
for (int i = ; i < ; i++)
{
ManualResetEvent mr = new ManualResetEvent(false);
WaitCallback wcl = t =>
{
TestThread2(t.ToString());
mr.Set(); //将该线程设置为终止状态
};
list.Add(mr);
ThreadPool.QueueUserWorkItem(wcl, "测试参数1");
}
foreach (var item in list)
{
item.WaitOne();
}

  3. 线程池的基本设置

             {
//1.设置最大和最小线程数
ThreadPool.SetMaxThreads(, );
ThreadPool.SetMinThreads(, );
//2.工作线程和IO线程最大值和最小值的获取(注释掉上面的设置,然后看下面的获取结果)
int workerThreads;
int ioThreads;
{
ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Max worker threads: {0}; Max I/O threads: {1}", workerThreads, ioThreads));
}
{
ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Min worker threads: {0}; Min I/O threads: {1}", workerThreads, ioThreads));
}
{
ThreadPool.GetAvailableThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Available worker threads: {0}; Available I/O threads: {1}", workerThreads, ioThreads));
}
}

.Net进阶系列(12)-异步多线程(Thread和ThreadPool)(被替换)的更多相关文章

  1. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

  2. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  3. .Net进阶系列(15)-异步多线程(线程的特殊处理和深究委托赋值)(被替换)

    1. 线程的异常处理 我们经常会遇到一个场景,开启了多个线程,其中一个线程报错,导致整个程序崩溃.这并不是我们想要的,我需要的结果是,其中一个线程报错,默默的记录下,其它线程正常进行,保证程序整体可以 ...

  4. .Net进阶系列(14)-异步多线程(async和await)(被替换)

    1.  方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告. #region 情况一 /// <summary> /// ...

  5. .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)

    一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...

  6. .NET进阶篇06-async异步、thread多线程1

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 异步多线程挺大一块内容,既想拆开慢慢学,又想一股脑全倒出.纠结再三,还是拆开吃透,也不至于篇幅过长,劝退许多人 本篇先做一个概述,列明一些基本概 ...

  7. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  8. 异步多线程 Thread ThreadPool Task

    一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...

  9. 多线程-Thread和ThreadPool

    多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...

随机推荐

  1. 转帖: 一份超全超详细的 ADB 用法大全

    增加一句 连接 网易mumu模拟器的方法 adb  connect 127.0.0.1:7555 一份超全超详细的 ADB 用法大全 2016年08月28日 10:49:41 阅读数:35890 原文 ...

  2. IDEA 操作及快捷键总结

    一.设置IDEA使用Eclipse快捷键 File->Settings->Keymap->选择Eclipse,就可以使用Eclipse的快捷键了,但是不能修改.如果想要修改,需要点击 ...

  3. Jquery Ajax xml版Get请求PHP

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  4. Jquery 组 checkbox全选checkbox

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  5. IntersectionObserver简介

    写在前面 在移动端,有个很重要的概念,叫做懒加载,适用于一些图片资源特别多,ajax数据特别多的页面中,经常会有动态加载数据的场景中,这个时候,我们通常是使用监听scroll或者使用setInterv ...

  6. ssh 将22端口换为其它 防火墙设置

    废话不多说,先通过当前的SSH端口(默认为:22)登陆. 1.修改配置文件:/etc/ssh/sshd_config ,找到 #port 22 2.先将Port 22 前面的 # 号去掉,并另起一行. ...

  7. 读取excel思路

    1.输入地址 2.输入指定的sheet  通过sheet()[]方式指定 3.输入执行的单元位置 通过 .cell_value(x,y)方式指定 示例 data = xlrd.open_workboo ...

  8. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  9. QAU 18校赛 J题 天平(01背包 判断能否装满)

    问题 J: 天平 时间限制: 1 Sec  内存限制: 128 MB提交: 36  解决: 9[提交][状态][讨论版][命题人:admin] 题目描述 天平的右端放着一件重量为w的物品.现在有n个重 ...

  10. hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6319 思路: 单调队列倒着维护,队列里面剩下的值的数量就是这一段区间的count值,如样例第一个区间:3 ...