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#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- web浏览器兼容问题
1.居中问题 div中,ie默认居中,而ff(firefox)默认是向左对齐.解决办法:margin 0 auto 2.高度问题 如果有两个div排列或者嵌套,如果第一个div设置了高度,而内容超出d ...
- 十、ABP
一.官网 安装 安装成功Core 2.2版本的
- CentOS7 搭建影梭服务器
安装Python包管理工具 yum install python-setuptools && easy_install pip 安装Shadowsocks pip install sh ...
- vuex2.0 基本使用(1) --- state
Vuex 的核心是 store, 它是一个通过 Vuex.Store 构造函数生成的对象.为什么它会是核心呢?因为我们调用这个构造函数创建store 对象的时候,给它传递参数中包装了state, mu ...
- 找工作的程序员必懂的Linux
一.为什么要学习Linux 首先,我想先说一下:“为什么要学习Linux”?Linux 是什么,它是一款操作系统,是一个支持多用户.多任务.支持多线程和多CPU的操作系统:32位和64位的硬件可以在L ...
- docker registry v2与harbor的搭建
docker的仓库 1 registry的安装 docker的仓库我们可以使用docker自带的registry,安装起来很简单,但是可能有点使用起来不是很方便.没有图形化. 开始安装 使用镜像加速器 ...
- Listview 包含 edittext 的解决方案
转载:https://blog.csdn.net/qq_28268507/article/details/53666576 一. 前几天在群里聊天,碰到一个哥们问listview的itemview中包 ...
- this view is not constrainted......
this view is not constrainted 解决方案: <EditText android:id="@+id/editText" android:layout ...
- 洛谷P1395 会议 题解
$题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题. 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点 ...
- Django+Xadmin打造在线教育系统(二)
基于xadmin的后台管理 先使用pip进行安装xadmin及其依赖包 pip install django-adminx 安装完成后卸载xadmin,保留依赖包即可 pip uninstall dj ...