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#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- JAVA不可变类(immutable)机制与String的不可变性--非常好.
JAVA不可变类(immutable)机制与String的不可变性 https://www.cnblogs.com/jaylon/p/5721571.html
- has invalid type <class 'numpy.ndarray'>, must be a string or Tensor
转自: https://blog.csdn.net/jacke121/article/details/78833922 has invalid type <class 'numpy.ndarra ...
- eclipse中将Java项目转换为JavaWeb项目
eclipse导入一些war项目后,会以java项目形式存在,因此我们需要将java项目转换成web项目,不然项目也许会报错. 1.右键已经导入的项目,选择properties. 2.选中projec ...
- 实用的几个JS新特性(es 2016)
在Chrome 55下测试,可用. 1.箭头函数(arrow function) 以前写的匿名函数是这样的 function(){}, 现在可以简单写成这样()=>{} 如果直接return,没 ...
- default配置页面一级菜单用于进入二级菜单
- Java自定义线程池-记录每个线程执行耗时
ThreadPoolExecutor是可扩展的,其提供了几个可在子类化中改写的方法,如下: protected void beforeExecute(Thread t, Runnable r) { } ...
- Java虚拟机构建对象过程小记
Java对象的内存分布 Java对象的构建 Java程序中,新建对象,除了常见的new语句之外,还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstan ...
- Nginx+Tomcat 负载均衡集群
案例分析 通常情况下,一台Tomcat站点由于可能出现单点故障及无法应对多客户复杂多样性的请求等问题,不能单独应用于生产环境下,所以我们需要一套更可靠的解决方案来完善Web站点架构. Nginx是一款 ...
- Number Sequence POJ - 1019 递推 数学
题意 1 12 123 1234 12345 ....这样的序列 问第n位数字是几 是数字! 1-9! 思路:递推关系 主要是位数的计算 用a[i]=a[i-1]+(int)log10((do ...
- AHOI2013 差异 【后缀数组】
题目分析: 求出height以后很明显跨越最小height的一定贡献是最小height,所以对于区间找出最小height再将区间对半分. 代码: #include<bits/stdc++.h&g ...