Thread(线程)

Thread开启线程:接收一个参数

TestClass tc = new TestClass();
//没有返回值,有一个object类型的参数的委托;两种写法。
ParameterizedThreadStart threadStart1 = t => tc.TestThread(t.ToString());
//ParameterizedThreadStart threadStart2 = new ParameterizedThreadStart(tc.TestThread);
List<Thread> threadList = new List<Thread>();
for (int i = ; i < ; i++)
{
Thread thread = new Thread(threadStart1);
thread.Start("test" + i);
threadList.Add(thread);
} //等待Thread执行结束1,
while (threadList.Count(c => c.ThreadState == ThreadState.Running) > )
{
Thread.Sleep();
} //等待Thread执行结束2,附加都主线程,
//主线程会等待附加的线程结束,然后再执行下面的操作,会卡界面。
//foreach (var item in threadList)
//{
// item.Join();
//} Console.Read();

测试方法:

public class TestClass
{
public void TestThread(object name)
{
Console.WriteLine("TestThreadStart ThreadID:{0},Name:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, name, DateTime.Now.ToString());
long num = ;
for (int i = ; i < ; i++)
{
num += i;
}
string result = num.ToString();
Console.WriteLine("TestThreadEnd ThreadID:{0},Name:{1},Time:{2},Result:{3}", Thread.CurrentThread.ManagedThreadId, name, DateTime.Now.ToString(), result);
}
}

Thread,默认是 前台线程,前台线程 即使 程序进程 结束,前台线程也会继续执行完毕。

后台线程:会随着 程序进程 的结束而强制结束,无论是否执行完毕。

Thead.Join()是附加到主线程上面,所以当 程序进程 结束的时候,被Join的线程也会强制结束。

Thread.IsBackground 可以设置 是否是后台线程。

Thread回调、返回值

/// <summary>
/// Thread实现回调函数;通过修改共有变量,获取Thread返回值;
/// </summary>
/// <param name="func"></param>
/// <param name="callBack"></param>
/// <returns></returns>
public string ThreadWithCallBack(Func<string> func, Action callBack)
{
string result = null;
ThreadStart threadStart = new ThreadStart
(
() =>
{
result = func();
callBack();
}
);
Thread thread = new Thread(threadStart);
thread.Start();//线程开始
thread.Join();//附加到主线程,主线程将等待异步结束
return result;
}

ThreadPool(线程池)维护一定数量的线程,当有新的线程申请时,分配空闲线程给他使用,使用完毕后释放,线程可以重复使用。

而Thread每次都是申请新的线程,回收需要GC垃圾回收机制自动回收。

线程池里的线程全部都是后台线程。获得最大 工作线程、io线程。

int workerThreads = 0, ioThreads = 0;

ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);

线程池实现异步、线程池等待:

#region ThreadPool 线程池实现异步、线程池等待
{
TestClass tc = new TestClass();
//线程池实现异步
//WaitCallback callBack = t => { tc.TestThread(t); };
//ThreadPool.QueueUserWorkItem(callBack, "ThreadPoolTest"); //int workerThreads = 0, ioThreads = 0;
//ThreadPool.GetMaxThreads(out workerThreads, out ioThreads); //线程池等待
//当设为 false,为非终止状态,WaitOne() 不会立即返回,等待Set() =>执行 Set() 后,变成终止状态
//当设为 true,为终止状态,WaitOne() 立即返回,等待Set() =>执行 Set() 后,变成终止状态
ManualResetEventSlim manualReset = new ManualResetEventSlim(false);//ManualResetEventSlim 是线程安全的
WaitCallback callBack1 = t =>
{
tc.TestThread(t);
manualReset.Set();
};
//执行线程池
ThreadPool.QueueUserWorkItem(callBack1, "ThreadPoolTest");
//等待线程执行结束
manualReset.WaitHandle.WaitOne();
}
#endregion

Thread(线程)和ThreadPool(线程池) Thread回调与返回值的更多相关文章

  1. .net 线程基础 ThreadPool 线程池

    1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...

  2. WinpCap 使用线程发数,明明发了,返回值0是OK的啊,怎么抓包看不到,难道不支持多线程。。。

    if (!m_adapterHandle){    return false;}int rst = pcap_sendpacket((pcap_t*)m_adapterHandle,data ,dat ...

  3. js遍历ajax回调函数返回值中的object对象

    function printObject(obj) {      //obj = {"cid":"C0","ctext":"区县& ...

  4. Delphi ThreadPool 线程池(Delphi2009以上版本适用)

    http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...

  5. ThreadPool线程池的几种姿势比较

    from multiprocessing.pool import ThreadPool #from multiprocessing.dummy import Pool as ThreadPool #这 ...

  6. java使用Callable创建又返回值的线程

    并发编程使我们可以将程序分为很多个分离的,相互之间独立的任务,通过使用多线程的机制,将每个任务都会有一个执行线程来单独的驱动,一个线程是 进程中一个单一顺序控制流,一个进程可以拥有多个线程,也就相当于 ...

  7. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

  8. 死磕 java线程系列之线程池深入解析——体系结构

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己 ...

  9. C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()

    在C#多线程编程中,关于是使用自己创建的线程(Thread)还是使用线程池(ThreadPool)线程,一直很困惑,知道看了Jeffrey Richter的相关介绍才明白,记录如下: 当满足一下任何条 ...

随机推荐

  1. SVM的sklearn.svm.SVC实现与类参数

    SVC继承了父类BaseSVC SVC类主要方法: ★__init__() 主要参数: C: float参数 默认值为1.0 错误项的惩罚系数.C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确 ...

  2. VS2015+Python3.5的配置

    之前就学过一点Python,不用就忘记了,现在旧事从提~~ 学Python肯定得有一个良好的调试环境,比较熟悉VS,所以就配置了这个语言和工具! 安装过程出现的问题及解决方案 问题一: VS2015更 ...

  3. 【转】ECharts3.x中的点击事件与行为

    在ECharts中主要通过 on 方法添加事件处理函数,ECharts中的事件主要分为两种,1)鼠标事件,在鼠标click  or  hove 时触发鼠标事件: 2)另外一种是在ECharts在做图形 ...

  4. c++官方文档-指针

    #include<stdio.h> #include<iostream> #include<queue> #include<map> #include& ...

  5. 2k8 32bit下载

    Windows Server 2008 32-bit Standard(标准版) Windows Server 2008 32-bit Enterprise(企业版) Windows Server 2 ...

  6. 数据结构之线索二叉树——C语言实现

     线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...

  7. 7 python 类的组合

    1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...

  8. ABAP-关于隐式与显式的DB Commit

    转载:https://www.cnblogs.com/liaojunbo/archive/2011/07/11/2103491.html 1.显式的DB Commit 显式的DB Commit并没有对 ...

  9. 面试题-------SSL协议简介

    SSL协议简介 SSL简介 Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之 ...

  10. Optimizing graphics performance

    看U3D文档,心得:对于3D场景,使用分层次的距离裁剪,小物件分到一个层,稍远时就被裁掉,大物体分到一个层,距离很远时才裁掉,甚至不载.中物体介于二者之间. 文档如下: Good performanc ...