C# 线程(二)——Thread学习
public static void Dosomething(object? word)
{
Console.WriteLine(word.ToString());
}
ParameterizedThreadStart ps = new ParameterizedThreadStart(Dosomething);
Thread thread1 = new Thread(ps);
thread1.Start("埃里克多");
1.2不带参数的构造方法——Thread(ThreadStart)
ThreadStart构造方法,定义:public delegate void ThreadStart();
ThreadStart ts = new ThreadStart(Dothing);
Thread thread2 = new Thread(ts);
thread2.Start();
public static void Dothing()
{
Console.WriteLine("这是个无参数的方法。。。。");
}
二、相关属性及方法
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数,此时线程处于休眠状态,期间此线程不再得到系统分配的执行时间片。
Thread.Abort():以开始终止此线程的过程。
2.1线程的执行是无序的
DisorderVerify();
//多次执行后会得到下面两种结果
//结果一:
//Thread_2 is start
//Thread_1 is start
//结果二:
//Thread_1 is start
//Thread_2 is start
static void DisorderVerify()
{
Thread thread1 = new Thread(() => Console.WriteLine("Thread_1 is start"));
thread1.Name = "Thread_1"; Thread thread2 = new Thread(() => Console.WriteLine("Thread_2 is start"));
thread2.Name = "Thread_2"; thread1.Start();
thread2.Start();
}
2.2 Thread.join函数
当thread1调用Join方法的时候,主线程MainThread、thread2就被停止执行,直到thread1线程执行完毕,MainThread、thread2存在交叉执行
for (int i = 0; i < 20; i++)
{
if (i == 4)
{
JoinMethodTest();
}
else
{
Console.WriteLine($"主线程执行:{i}");
} }
static void JoinMethodTest()
{
Thread thread1 = new Thread(() =>
{
for (int i = 0; i <10; i++)
{
Console.WriteLine("ddd");
} });
Thread thread2 = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("aaa");
} });
thread1.Start();
thread1.Join();
//等待thread1执行完再执行
thread2.Start();
}
执行结果:
//主线程执行:1
//主线程执行:2
//主线程执行:3
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//主线程执行:5
//主线程执行:6
//主线程执行:7
//主线程执行:8
//主线程执行:9
//主线程执行:10
//主线程执行:11
//主线程执行:12
//主线程执行:13
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//主线程执行:14
//主线程执行:15
//主线程执行:16
//主线程执行:17
//主线程执行:18
//主线程执行:19
三、前台线程及后台线程
Thread默认创建的为前台线程,可以看到当thread 为前台线程时,即使主线程执行结束,thread也会执行后程序才会结束;当threa为后台线程时,主线程执行结束,程序就结束了。
public static void BackGroundThreadTest()
{
Thread thread = new Thread(() =>
{
Thread.Sleep(3000);
Console.WriteLine("后台线程测试");
});
thread.IsBackground = true;
thread.Start(); }
//后台方法测试
BackGroundThreadTest();
Console.WriteLine("主线程结束。。。。");
//打印结果:
//主线程结束。。。。 //将方法里的thread.IsBackground = true;注释
//打印结果:
//主线程结束。。。。
//后台线程测试
C# 线程(二)——Thread学习的更多相关文章
- java并发编程学习: 守护线程(Daemon Thread)
在正式理解这个概念前,先把 守护线程 与 守护进程 这二个极其相似的说法区分开,守护进程通常是为了防止某些应用因各种意外原因退出,而在后台独立运行的系统服务或应用程序. 比如:我们开发了一个邮件发送程 ...
- java学习笔记之线程(Thread)
刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...
- 从零开始构建一个Reactor模式的网络库(二)线程类Thread
线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...
- 7种创建线程方式,你知道几种?线程系列Thread(一)
前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对 ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十二周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...
- 【转】线程、Thread类和线程终止
一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 线程(Thread,ThreadPool)、Task、Parallel
线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Fr ...
随机推荐
- Django设置跨域请求解决方案
Django设置跨域请求解决方案 在现代Web开发中,跨域资源共享(CORS,Cross-Origin Resource Sharing)是一个常见的需求.尤其是在前后端分离的开发模式下,Django ...
- C/C++ 以及 Rust 中的 getch() 实现
getch 是一个在 C 语言编程中常用的函数,用于从键盘读取一个字符,但不回显到屏幕上. 在 Windows 环境下,getch 实现通常包含在 <conio.h> 头文件中.需要注意的 ...
- changeServer.sh一键切换服务器脚本
直接看改进版2.0 切换服务器,免密登录vi changeServer.sh #!/bin/bash #authe by wangxp export IFCFG=/etc/sysconfig/netw ...
- dart 数组去重
List list = ['1','2','3','3']; list = list.toSet().toList();
- 《<吕氏春秋> 刘本》
<<吕氏春秋> 刘本>(卷三) 编者 刘昱合 其他版本 <吕氏春秋>(卷一) <吕氏春秋>(卷二) <<吕氏春秋> 全本>(卷三 ...
- 微信扫码登录授权过程中state字段的用法
问题描述 最近在实现微信扫码登录这一块,然后看到state字段上面说是可以防csrf攻击 那么现在假设一个用户扫完码后由于某些原因扫码后的响应还没到,但是该平台的回调url已被窃取,然后被人设置到某个 ...
- AI 发展下的伦理挑战,应当如何应对?
一.构建可靠的 AI 隐私保护机制 在当今数字化时代,人工智能的广泛应用给我们的生活带来了诸多便利,但与此同时,个人隐私保护问题也日益凸显.在不牺牲个人隐私的前提下,设计和实施有效的数据保护措施,特别 ...
- Docker - 部署zyplayer_doc团队协作文档
原文链接:https://mp.weixin.qq.com/s/ew3O0EKLo8KoOMkpT-IePw 一.介绍 zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,提 ...
- Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手
原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话. deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+V ...
- postman发送数组
postman发送数组 第一种 第二种