c#线程1
开启一个线程的方式:
方式一:Thread t1 = new Thread(Method_1);
t1.Start();
方式二:委托
Action ac = Method_1;
ac.BeginInvoke(null, null);
线程其实就是操作系统中提到更加小的运行单元,比如一个进程可以存在多个线程,线程的执行不一定按顺序,并且从外部看来是同时进行的。
我们举一个线程的一般定义,当然在定义之前需要先导入线程命名空间 using System.Threading;
class Demo1
{
public void Method_1()
{
for (int i = ; i < ; i++)
{
Console.WriteLine("我是线程1");
}
} public void Method_2()
{
for (int i = ; i < ; i++)
{
Console.WriteLine("我是线程2");
}
} public void Test()
{
Thread t1 = new Thread(Method_1);
t1.Start(); Thread t2 = new Thread(Method_2);
t2.Start();
} static void Main(string[] args)
{
Demo1 obj = new Demo1();
obj.Test();
}
如果对于某一个线程比较简单,可以使用Lamda表达式
public void Test1()
{
Thread t1 = new Thread(
() =>
{
for (int i = ; i < ; i++)
{
Console.WriteLine("我是线程1");
}
}
);
t1.Start(); Thread t2 = new Thread(
() =>
{
for (int i = ; i < ; i++)
{
Console.WriteLine("我是线程2");
}
}
);
t2.Start();
} static void Main(string[] args)
{
Demo1 obj = new Demo1();
obj.Test1();
}
线程中的方法不止上文的,它本身有3个重载方法,接下来是线程传递一个参数的例子:
public void LoadDownFile(object fileName)
{
Console.WriteLine("文件名:"+fileName.ToString());
Console.WriteLine("文件下载:"+Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine("下载完毕");
} public void Test2()
{
Thread t = new Thread(LoadDownFile);
t.Start("abc.mov");
}
线程传递多个参数,在构造函数传递多个参数。
public class ThreadTest
{
private string _FilePath;
private string _FileName; public ThreadTest(string filePath,string fileName)
{
_FilePath = filePath;
_FileName = fileName;
} public void DownLoadFile()
{
Console.WriteLine("开始下载"+_FileName+"//"+_FilePath);
Thread.Sleep();
Console.WriteLine("下载完毕");
}
}
public void Test3()
{
ThreadTest thObj = new ThreadTest("伤心的人别听慢歌","你呀你我说你什么好");
Thread t1 = new Thread(thObj.DownLoadFile);
t1.Start();
}
委托开启线程,委托开启的线程是后台线程,需要加Console.ReadLine()要求主线程不关闭,知道后台线程运行完毕。
public void Test4()
{
Action ac = Method_1;
ac.BeginInvoke(null, null);
Console.ReadLine();
} public void Test5()
{
Action<int> ac = Method_3;
ac.BeginInvoke(, null, null);
Console.ReadLine();
}
为了解决主线程不等待后台线程的情况,可以接收一个线程的返回值,进而判断其是否运行完成。
public int LoadMoreFile(int num)
{
Console.WriteLine("正在下载");
Thread.Sleep();
return num;
} public void Test6()
{
Func<int, int> fu = LoadMoreFile;
#异步调用状态
IAsyncResult result = fu.BeginInvoke(, null, null);
while (!result.IsCompleted)
{
Console.Write(".");
}
int intResult = fu.EndInvoke(result);
Console.WriteLine("线程返回的数值:"+intResult);
Console.ReadLine();这里不需要加,因为主线程会等待后台线程结束后退出
}
使用回调函数实现线程异步:
public void Test7()
{
Console.WriteLine("使用回调函数的方式");
Func<int, int> fu = LoadMoreFile;
fu.BeginInvoke(, OnCallBack, fu);
//主线程继续执行,当子线程结束自动回调,实现异步提高CPU效率
//..........
Console.ReadLine();
} //OnCallBack()是回调函数,当子线程结束时,自动调用
public void OnCallBack(IAsyncResult ar)
{
Func<int, int> res = ar.AsyncState as Func<int, int>;
int intResult = res.EndInvoke(ar);
Console.WriteLine("在回调函数中的结果:"+intResult);
}
线程设置其中的优先级:5中优先级,Highest、AblowNormai、Normal、BelowNormal、Lowest。
public void Test()
{
Thread t1 = new Thread(Method_1);
Thread t2 = new Thread(Method_2);
Thread t3 = new Thread(Method_3);
t1.Start();
t2.Start();
t3.Start(); t1.Priority = ThreadPriority.Highest;
t2.Priority = ThreadPriority.BelowNormal;
t3.Priority = ThreadPriority.Lowest;
}
前台线程和后台线程:
前台线程:主线程和Thread构造的线程都是前台线程,前台线程可以修改为后台线程t.IsBackgound()
后台线程:比如之前通过委托构造的线程,Begin***为后台线程
需要注意一点的是:后台线程会随着前台线程的结束而关闭,也就说前台线程必须完成,而后台线程则会选择性关闭。
public void SleepTime()
{
Console.WriteLine("开始执行");
Thread.Sleep();
Console.WriteLine("执行完毕");
} public void Test2()
{
Thread t = new Thread(SleepTime);
t.Start();
t.IsBackground = true;
Console.ReadLine();
}
c#线程1的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java 线程
线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- 关于Select2下拉框组件
文档如下: https://select2.org/configuration/options-api
- E: Unable to correct problems, you have held broken packages
问题: apt install libmysqlclient-dev Reading package lists... DoneBuilding dependency tree Readi ...
- Lodop打印控件指定打印任务某几页
使用Lodop打印控件进行打印开发,有时候一个任务里有多页,例如各种合同之类的,客户端用户在使用过程中,可能有某一页打印后发现需要修改,这时候不必再把整个任务重新打印一遍,只需要打印需要修改的那页重新 ...
- Membership 介绍
ASP.NET成员资格为您提供了验证和存储用户凭据的内置方式.因此,ASP.NET成员可以帮助您管理网站中的用户身份验证.您可以使用ASP.NET表单身份验证使用ASP.NET成员身份,方法是使用AS ...
- 当考虑到并发问题时候,我们需要将给表插入id的代码挪到service中,目的是将其放到一个事务中,保准事务的一致性
- PC平台的SIMD支持检测
如果我们希望在用SIMD来提升程序处理的性能,首先需要做的就是检测程序所运行的平台是否支持相应的SIMD扩展.平台对SIMD扩展分为两部分的支持: CPU对SIMD扩展的支持.SIMD扩展是随着CPU ...
- Java中的getGenericSuperclass的基本用法
通过getGenericSuperclass方法可以获取当前对象的直接超类的Type,使用该方法可以获取到泛型T的具体类型 package cn.tzz.lang.clazz; public clas ...
- BZOJ4695 最假女选手(势能线段树)
BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...
- Hdoj 1203.I NEED A OFFER! 题解
Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用 ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...