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#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- mysql 数据库的主从同步
1.复制准备 操作系统 centOS 主库(mysql master): ip为123.56.94.1 port为3306 mysql 版本 5.7.16 从库(mysql slave): ...
- scss 转为 less
tnpm install less-plugin-sass2less -g && sass2less **/*.scss {dir}/{name}.less && rm ...
- Java多线程之静态代理
package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...
- vue axios 封装(一)
封装一: 'use strict' import axios from 'axios' import qs from 'qs' import NProgress from 'nprogress' im ...
- 如何消除原生Android网络状态上的惊叹号
喜欢使用原生Android系统的朋友可能会发现自己的状态栏信号图标上经常有一个惊叹号标志. 这是怎么回事呢?原因是Android为了对网络状态进行检测,采用了一种叫做captive detection ...
- Atcoder Beginner Contest 121 D - XOR World(区间异或和)
题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d 题目很裸(Atcoder好像都比较裸 就给一个区间求异或和 n到1e12 肯定不能O(n) ...
- JavaScript Decorators 的简单理解
Decorators,装饰器的意思, 所谓装饰就是对一个物件进行美化,让它变得更漂亮.最直观的例子就是房屋装修.你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买 ...
- CF 1041 1042整理
终于回来整理了,这两场比赛我也是醉了,第一场-1分,第二场被skip,还是太菜啊qaq CF1041 T1T2过水忽略直接看后面 T3大意:给你一个长度为n的序列a1,a2,a3···an,你需要把这 ...
- HDU4035 Maze 【树形DP】【期望DP】
题目分析: 以前一直不会这个方法, 我好菜啊. 转移分为三个部分,一个是直接成功,一个是转移到E1,还有一个是转移到自己周围的一圈儿点. 如果是叶子那么只能转移到父亲,如果不是叶子可以把非叶子的转移代 ...
- [POJ2976] Dropping tests
传送门:>Here< 题意:给出长度相等的数组a和b,定义他们的和为$\dfrac{a_1+a_2+...+a_n}{b_1+b_2+...+b_n}$.现在可以舍弃k对元素(一对即$a[ ...