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. iOS TTF文件改变字体

    TTF(True Type Font):是一种字库名称 TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式 使用: 1 获取字体文件 从各种渠道下载字体ttf,网站或从别的ip ...

  2. 【POJ】2480 Longge's problem(欧拉函数)

    题目 传送门:QWQ 分析 题意就是求∑gcd(i, N) 1<=i <=N.. 显然$ gcd(i,n) = x $时,必然$x|n$. 所以我们枚举一下n的约数,对于每个约数x,显然$ ...

  3. 安装phoenix时,执行命令./sqlline.py hostname1,hostname2.hostname3..... 时报错 ImportError: No module named argparse

    问题描述: 怎么解决呢: 网上看了好多方法,但是本屌丝表示看不懂啊,没理解人家的博客的博大精深,好吧我们回到正题!! 先切换到root用户下安装这个东西  yum  install  python-a ...

  4. lucene中TOKENIZED,UN_TOKENIZED 解釋

    Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED)); 這些地方與舊版本有很大的區別 ...

  5. solr联合多个字段进行检索(multivalued和copyfield的使用)

    在实际工作中不仅仅对索引中的单个字段进行搜索.需要进行综合查询. 比如book表中有id,name(标题),price,summary(摘要),content(内容),我们要找一本书的时候,查询关键字 ...

  6. collections模块---(namedtuple、deque、OrderdDict、defaultdict、Counter)和configparser模块

    在内置数据类型(dict. list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter. deque.defaultdict.namedtuple 和 ...

  7. uva297

    题意: 一个四叉树用来格式编码图像,这个想法的基础是任意的图像能够分成四个象限.每个象限能够拆分成四个子象限,比如,在四叉树中,每一个图像都被一个父节点表示,根据预先定义好的顺序,四个孩子节点代表四个 ...

  8. 15.python操作mysql

    导入包 from pymysql import* 1. 创建 Connection 连接 conn=conne(host='192.168.13.130',port=3306 ,database='' ...

  9. @Slf4j注解

    参考:https://blog.csdn.net/qq_26344609/article/details/78905845 如果不想每次都写private final Logger logger = ...

  10. restful 注解 总结 (比较完整的):http://www.xuetimes.com/archives/388 , https://www.cnblogs.com/chen-lhx/p/5599806.html

    参考1:  http://www.xuetimes.com/archives/388 参考2:   https://www.cnblogs.com/chen-lhx/p/5599806.html 参考 ...