我们先从最基础的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. ubuntu16.04开机时的.local问题

    开机时显示:您的当前网络有.local域,我们不建议这样做而且这与AVAHI网络服务探测不兼容,该服务已被禁用 解决方法: 在终端输入:sudo gedit /etc/default/avahi-da ...

  2. 体验一把做黑客的感觉-IPC$入侵之远程控制

    前言 一看你就是看标题进来的,我可不是标题党啊,大家往下看吧,本文章主要介绍了利用IPC共享漏洞上传并执行木马. 基础知识 一.什么是IPC 进程间通信(IPC,Inter-Process Commu ...

  3. [Swift]LeetCode291. 单词模式 II $ Word Pattern II

    Given a pattern and a string str, find if strfollows the same pattern. Here follow means a full matc ...

  4. [Swift]LeetCode833. 字符串中的查找与替换 | Find And Replace in String

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  5. less环境的安装与搭建

    less: Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充.Less 可以运行在 Node 或浏 ...

  6. 执行find / -name *.sh时报错 find: 路径必须在表达式之前: start-ressvr-release.sh

    想查找一个包含4000多文件的目录下所有.sh结尾的文件 使用命令     find  ./ -name *.sh     (本身已经在要查找的目录里了) 结果报错:  解决方法一:find ./ - ...

  7. Python档案袋(文件系列操作 )

    文件读写基础 简单的读文件: # r 表示只能读 #打开文件,得到文件光标对象,文件不存在则报错 f=open("ww.txt","r",encoding=&q ...

  8. 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字(python)(原创)

    背景: 电话面试&手撕代码 2019.03.22 Mufasa 问题: 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字 条件: 这串数字是有序数 解决方法: 核心代码只有 ...

  9. BBS论坛(四)

    4.1.cms登录页面csrf保护 (1)Perfect_bbs.py from flask_wtf import CSRFProtect CSRFProtect(app) 添加csrf保护后,现在再 ...

  10. 【从零开始自制CPU之学习篇03】锁存器与触发器

    本篇学习了两种锁存器:SR Latch和D Latch,一种触发器:D flip flop SR Latch:SR—锁存器 初始状态下,S和R都为0,Q和Q‘随机有一个为1另一个 为0(取决于电流速度 ...