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的相关介绍才明白,记录如下: 当满足一下任何条 ...
随机推荐
- Ubuntu-14.04.1 desktop安装时及安装后遇到的小问题
ubuntu安装时,进入桌面就黑屏:ctrl+alt+F1进入终端1,输入:startx,此时桌面会重新出现,快速修改桌面的分辨率即可.没有及时修改可以重复上面操作. su root认证失败:sudo ...
- Linux火焰图-centos
centos7.5mini安装 yum install -y yum-utils perf debuginfo-install -y perf #debuginfo-install下载了305MB的文 ...
- 洛谷 P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- 使用CMQ和SCF实现邮件发送
准备腾讯云 API 调用工具 使用 API 命令行工具来管理和运行无服务器云函数(SCF),下面就先来安装配置该工具. 安装 Python 和 PIP Python 环境是腾讯云命令行工具运行时的必要 ...
- 国内访问Google的方法(Google学术、Google香港、Twitter等)
通过修改host文件达到访问Google等国外网址的目的 打开下面网址,里面会定期更新host文件,而且有详细的方法 https://laod.cn/hosts/2017-google-hosts.h ...
- html-字体
字体大小 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- jmeter-noguimodel
jmeter -Dthreads= -n -t ~/Desktop/image-controller.jmx -l myimage/out -e -o myimage/log -j myimage/r ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- win10 + Ubuntu 双系统,重装后的引导修复,时间调整和启动项调整
▶ 原先为 win10 + Ubuntu 双系统,使用 grub2 作引导,在重装了 win10 (大作死升到了1803)后系统重写了引导,启动项里找不到 Ubuntu,需要修复. ● 参考[http ...
- spring Ioc和DI
spring的“控制反转”和“依赖注入”,个人看来是一个意思. 传统java程序中,使用一个对象的时候,都需要先new Object()创建一个新对象,才能使用.对象的控制权,在程序手里. 使用spr ...