我们先从最基础的Thread说起。

创建并启动线程

创建并启动一个线程,如下代码:

 namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
var thread = new Thread(PrintNumbers);
thread.Start(); Console.WriteLine("Thread Start...");
Console.ReadKey();
} /// <summary>
/// 匹配委托的方法
/// </summary>
public static void PrintNumbers()
{
Console.WriteLine("Starting......");
for (int i = ; i < ; i++)
{
Console.WriteLine(i);
}
}
}
}

运行结果:

暂停线程

假如需要暂停当前线程,可以调用Thread.Sleep方法,使当前线程处于阻塞状态,如下代码:

 namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
var thread = new Thread(PrintNumbersWithDelay);
thread.Start(); Console.WriteLine("Thread Start...");
Console.ReadKey();
} /// <summary>
///
/// </summary>
public static void PrintNumbersWithDelay()
{
Console.WriteLine("Starting......");
for (int i = ; i < ; i++)
{
Thread.Sleep(TimeSpan.FromMilliseconds());
Console.WriteLine(string.Format("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), i));
}
}
}
}

输出结果:

合并线程

如果需要等待某个子线程执行行,主线程才继续执行时,可以使用Thread.Join方法来实现,如下代码:

 namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
//Thread
var thread = new Thread(PrintNumbersWithDelay);
thread.Start();
thread.Join(); Console.WriteLine("Thread Completed!");
Console.ReadKey();
} /// <summary>
///
/// </summary>
public static void PrintNumbersWithDelay()
{
Console.WriteLine("Starting......");
for (int i = ; i < ; i++)
{
Thread.Sleep(TimeSpan.FromMilliseconds());//线程阻塞1s,此时线程状态为WaitSleepJoin
Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),Thread.CurrentThread.ThreadState, i));
}
}
}
}

输出结果:

终止线程

如果在子线程运行过程中强制终止它,可以调用Thread.Abort方法,这会给当前子线程触发ThreadAbortException异常,导致线程被终止!

如下代码:

 namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Program...");
var thread = new Thread(PrintNumbersWithDelay);
thread.Start(); Thread.Sleep(TimeSpan.FromMilliseconds());
thread.Abort(); Console.WriteLine("Thread has been abort!");
Console.ReadKey();
} /// <summary>
///
/// </summary>
public static void PrintNumbersWithDelay()
{
Console.WriteLine("Starting......");
for (int i = ; i < ; i++)
{
Thread.Sleep(TimeSpan.FromMilliseconds());
Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i));
}
}
}
}

线程传递参数

通过分析可以发现,Thread接受的实际上是一个委托,包括无参数的委托和接受一个Object类型的委托,

如下代码:

 namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main thread starting...");
var thread = new Thread(PrintNumbersWithCount);
thread.Start();
thread.Join(); Console.WriteLine("Main thread completed!");
Console.ReadKey();
} /// <summary>
/// 匹配委托方法,带参数
/// </summary>
public static void PrintNumbersWithCount(object obj)
{
Console.WriteLine("Sub thread starting...");
var number = Convert.ToInt32(obj);
for (int i = ; i < number; i++)
{
Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i));
}
}
}
}

输出结果:

多线程(2)Thread的更多相关文章

  1. Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享

    Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...

  2. (转)多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

  3. NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL

    .NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...

  4. Perl6多线程1 Thread : new / run

    先看一个小例子: ) { #默认参数 say $name; } sub B(:name($name)) { #默认参数为 any say $name; } A(); A(); B(); B(name ...

  5. 多线程:Thread类的Join()方法

    多线程:Thread类的Join()方法 http://blog.163.com/hc_ranxu/blog/static/3672318220095284513678/ 当我们在线程B中调用Thre ...

  6. 【Android多线程】Thread和线程池

    https://www.bilibili.com/video/av65170691?p=3 (本文为此视频听课笔记) 一.为什么要使用多线程 二.Thread 2.1 通过继承Thread类 2.2 ...

  7. C#异步和多线程以及Thread、ThreadPool、Task区别和使用方法

    本文的目的是为了让大家了解什么是异步?什么是多线程?如何实现多线程?对于当前C#当中三种实现多线程的方法如何实现和使用?什么情景下选用哪一技术更好? 第一部分主要介绍在C#中异步(async/awai ...

  8. ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)

    一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...

  9. Java 多线程(1)-Thread和Runnable

    一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...

  10. C++实现多线程类Thread

    Windows编程中创建线程的常见函数有:CreateThread._beginthread._beginthreadex.据说在任何情况下_beginthreadex都是较好的选择. _begint ...

随机推荐

  1. SQL插入数据--数据中的某一列来自本表中的数据

    背景: 项目初期使用的配置库和业务库两种数据库并行,所有配置数据位于配置库,所有业务数据根据不同省份位于不同数据库.由于使用省份越来越多,各省的配置数据也越来越多导致配置库的数据量过于庞大,各省共用一 ...

  2. jenkins配置演示

    构建代码的几个名词: make:linux或者windows最原始的编译工具,在Linux下编译程序常用make,windows下对应的工具为nmake.它负责组织构建的过程,负责指挥编译器如何编译, ...

  3. python os.walk()方法--遍历当前目录的方法

    前记:有个奇妙的想法并想使用代码实现,发现了一个坑,百度了好久也没发现的"填坑"的文章~~~~~~~~~ 那就由我来填 os.walk()支持相对路径 例如 os.walk(&qu ...

  4. IOS菜鸟学习

    1.NS是系统库.2.IOS类的声明:@interface MyObject : NSObject {    int memberVar1; // 实体变量    id  memberVar2;} + ...

  5. [AI开发]Python+Tensorflow打造自己的计算机视觉API服务

    "与其停留在概念理论层面,不如动手去实现一个简单demo ."       ——鲁迅 没有源码都是耍流氓github 前言 目前提供AI开发相关API接口的公司有很多,国外如微软. ...

  6. 企业IT管理员IE11升级指南【12】—— 兼容视图列表介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  7. 你必须知道的10个Python第三库

    1. BeautifulSoup Beautiful Soup是一个可以从HTML,XML进行提取文件的Python库,日常我们使用爬虫进行数据抓取回来之后,往往需要进行数据解析. 使用它能让你开心愉 ...

  8. [Java]LeetCode133. 克隆图 | Clone Graph

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  9. Python内置函数(15)——dict

    英文文档: class dict(**kwarg) class dict(mapping, **kwarg) class dict(iterable, **kwarg) Return a new di ...

  10. 4.DOM

    定义 文档对象模型(Document Object Model)是一种用于HTML和XML文档的编程接口. 查找元素 1.直接查找 document.getElementById 根据ID获取一个标签 ...