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. Spark Standalone模式HA环境搭建

    Spark Standalone模式常见的HA部署方式有两种:基于文件系统的HA和基于ZK的HA 本篇只介绍基于ZK的HA环境搭建: $SPARK_HOME/conf/spark-env.sh 添加S ...

  2. Linux常用命令的命名来源

    很多人在学习Linux的时候会疑惑:这么多的Linux名,他们都是怎么被定义的?林纳斯是怎么制定如此花样繁多且数量庞大的命令?今天这篇文章可能会帮你解开疑惑. ## 1. 目录缩写 缩写 | 全称 | ...

  3. json 拖拽

    1.梳理知识点 1.事件对象   e || event  2.事件对象的属性      鼠标事件对象 : 坐标属性 :  clientX  clientY  pageX  pageY   offset ...

  4. python中的模块及包及软件目录结构规范

    知识内容: 1.模块的定义与分类 2.模块的导入 3.模块与包 4.不同目录下的模块调用 一.模块的定义与分类 1.什么是模块 模块就是实现了某个功能的代码集合,模块是由一大堆代码构成的 类似于函数式 ...

  5. Bogart gData.vb

    Imports System Imports System.Data Imports System.Data.OleDb Imports Microsoft.VisualBasic Imports S ...

  6. 练手THINKPHP5过程和bootstrap3.3.7

    1 在GIT上下载了最新版的源码,同时安装composer 用composer更新 git地址https://github.com/top-think/think 2 搭建本地开发环境,开启url重写 ...

  7. jquery函数写法

    普通jquery函数写法 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script&g ...

  8. mock——test 基本所有使用

    可以参考:http://www.cnblogs.com/lyy-2016/p/6122144.html test /** * */ package com.imooc.web.controller; ...

  9. VBA 打开带密码的文件

    ' 打开文件 ROSE 为只读密码 CHECK 为编辑密码    Set wb = Workbooks.Open(file, 0, True, , "ROSE", "CH ...

  10. hashlib 加密模块使用说明

    import hashlib  #hashilib 模块 m = hashlib.md5() m.update('hello 天王盖地虎'.encode(encoding = 'utf-8)) m.h ...