Thread(线程)和ThreadPool(线程池) Thread回调与返回值
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回调与返回值的更多相关文章
- .net 线程基础 ThreadPool 线程池
1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...
- WinpCap 使用线程发数,明明发了,返回值0是OK的啊,怎么抓包看不到,难道不支持多线程。。。
if (!m_adapterHandle){ return false;}int rst = pcap_sendpacket((pcap_t*)m_adapterHandle,data ,dat ...
- js遍历ajax回调函数返回值中的object对象
function printObject(obj) { //obj = {"cid":"C0","ctext":"区县& ...
- Delphi ThreadPool 线程池(Delphi2009以上版本适用)
http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...
- ThreadPool线程池的几种姿势比较
from multiprocessing.pool import ThreadPool #from multiprocessing.dummy import Pool as ThreadPool #这 ...
- java使用Callable创建又返回值的线程
并发编程使我们可以将程序分为很多个分离的,相互之间独立的任务,通过使用多线程的机制,将每个任务都会有一个执行线程来单独的驱动,一个线程是 进程中一个单一顺序控制流,一个进程可以拥有多个线程,也就相当于 ...
- Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
1.Java使用Thread类代表线程. 所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...
- 死磕 java线程系列之线程池深入解析——体系结构
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己 ...
- C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
在C#多线程编程中,关于是使用自己创建的线程(Thread)还是使用线程池(ThreadPool)线程,一直很困惑,知道看了Jeffrey Richter的相关介绍才明白,记录如下: 当满足一下任何条 ...
随机推荐
- AWR实战分析之---- PX Deq Credit: send blkd (转载)
该等待事件我在前面分析过,但是这次和上次产生的原因有些不一样,上次该等待事件的详细分析链接是:http://blog.sina.com.cn/s/blog_61cd89f60102eeen.html ...
- mysql 的安装,密码及修改 ,权限,基础语句(增删改查)
参考网址:https://www.cnblogs.com/majj/p/9160383.html (安装等) https://www.cnblogs.com/majj/p/9160421.htm ...
- Python Flask 多环境配置
Python里取配置文件的时候,之前是使用的ini文件和python里configparser 模块: 可参考:https://www.cnblogs.com/feeland/p/4514771.ht ...
- VB ListView罗列图片
一开始听到job的要求,还真不知道如何下手,用Gridview?好像有做不到把图片show出来的.在网上搜索一遍,发现原来是ListView与Imglist的结合应用. 看设计: Private ...
- IP分组交付和转发
1:交付 网络层监视底层物理网络对分组的处理过程叫做交付,分为直接交付和间接交付 1.1:直接交付 直接交付时,分组的终点是一台与交付着连接在同一个网络上的主机,发生在俩种情况下,分组的源点和终点都在 ...
- aix-syslog
收集网络内路由器的日志信息,同时把本地日志信息与路由器信息分开. /etc/syslog.conf我写成: ## 本地日志处理 *.notice;*.err;*.warn<tab>;< ...
- text-overflow:ellipsis ,溢出文本显示省略号
text-overflow:ellipsis 对溢出文本显示省略号有两个好处, 一是不用通过程序限定字数 二是有利于SEO. 需要使用对对溢出文本显示省略号的通常是文章标题列表,这样处理对搜索引擎更友 ...
- HTML5 浏览器接收的常用 content-type
<1> 常见的设置方法 response.setHeader("content-type", 'text/html'); <2> 浏览器接收的常用 cont ...
- leetcode476
public class Solution { public int FindComplement(int num) { //计算数字二进制的反码 var list = new List<int ...
- leetcode349
public class Solution { public int[] Intersection(int[] nums1, int[] nums2) { var list1 = nums1.ToLi ...