开启一个线程的方式:

方式一: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的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java 线程

    线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...

  5. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  6. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  7. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  8. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  9. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  10. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

随机推荐

  1. python数据结构与算法第十一天【希尔排序】

    1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...

  2. Servlet的cookie使用,500报错,tomcat和cookie语法不兼容解决

    出现类似上图的错误,应该是tomcat和cookie的语法不兼容 cookie不要用逗号","作分隔符,换井号#试试就可以了

  3. 简单触发器实例insert

    create or replace trigger tr_tb_if_archivesafter inserton tb_if_archivesfor each rowdeclarepragma au ...

  4. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! Complete Status:

    com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! C ...

  5. JAVA-Web 百度编辑器,修改默认大小

    百度UEditor富文本编辑器-设置默认字体.字号.行间距及添加字体种类 如果这个还不能改变大小了,找一下在文件夹UEditor--css--中default.css文件,搜索出红色部分: grid_ ...

  6. CABAC总结与补充讨论

    在之前的一篇文章CABAC中我们已经对算法中的大部分细节部分做了详细分析,这里做一个总结与拾遗. 总结 CABAC的编码可以分为以下四个部分: 上下文变量的初始化 待编码语法元素二值化 上下文建模(确 ...

  7. Nginx 针对上游服务器缓存

    L:99 nginx缓存 : 定义存放缓存的载体 proxy_cache 指令 Syntax: proxy_cache zone | off; Default: proxy_cache off; Co ...

  8. kubernetes 编排详解 资源分配

    ########给pod 分配cpu和内存资源apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: d ...

  9. BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序

    题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...

  10. Python中matplotlib模块解析

    用Matplotlib绘制二维图像的最简单方法是: 1.  导入模块 导入matplotlib的子模块 import matplotlib.pyplot as plt import numpy as ...