.NET Windows 多线程thread编程
网络编程 2021-07-04 22:40www.168986.cn编程入门
.里使用线程,用thread类,定义线程,启动,销毁,全部包括在这个类里,定义一个线程,必须指定这个线程的函数,也就是这个线程是做什么的
进程工厂搬砖头,10个工人搬完1000个砖头
线程每个工人,搬完100个砖头,就是一个任务
采用线程,异步搬
手工去搬,10个工人搬,效率高,异步执行,如果不采用线程,等第一个人搬完后第二个人才搬,那就慢了
什么时候不能用线程
如果要用小车来搬,只有一个小车,那么,在这样的情况下,就不应该用线程,因为只有一个小车,各个线程都在争夺和等待这个小车,所以不能用线程。如果这个时候还要用线程,则导致资源浪费,
因为每个线程都有自己的资源,如包工头(CPU)同一时间要管理这10个工人,而只有一个工人实际在做事。
线程的销毁在销毁的时候需要考虑一些问题,比如搬砖头时,你不可能在一个工人搬到一半的时候,你将他销毁,那砖头往哪放呢?
1..里使用线程
.里使用线程,用thread类,定义线程,启动,销毁,全部包括在这个类里定义一个线程,必须指定这个线程的函数,也就是这个线程是做什么的,搬砖头呢还是挑水
EG:
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
public void WorkerMethod()
{
Console.WriteLine ("AA ");
}
2.如果使用带有参数的线程
线程本身是不能带参数的,只能在类里定义一个全局变量,线程前先给这个变量赋值,然后在线程的函数里,去使用这个变量,以达到传参数的目的
EG:
public class SimpleThread
{
private string procParameter = "";
public SimpleThread (string strPara)
{
procParameter = strPara;
}
public void WorkerMethod()
{
Console.WriteLine ("参数输入为: " + procParameter);
}
}
class MainClass
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SimpleThread st = new SimpleThread("这是参数字符串!");
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
t.Join (Timeout.Infinite);
}
}
3.线程和委托
委托的目的类似C++的指钟,就是要把函数当做参数来传递
4.应用程序域
10个工人各自搬各自的,隔离开,不相互受影响,一个人抱怨不搬了,不影响其他人,电脑里也是一样的情况,各个应用程序间不能干扰,程序间不能访问,并且一个程序死了,整个电脑部能死机。
5.线程池
就如内存,如果工人搬砖头,突然有2个工人因为什么原因不能搬了,那么从线程池里调用其他线程来做,性能好,创建一个线程需要浪费时间和资源
6.异步调用
调用WebService为例
同步调用一个WebService时,调用完了,才执行狼蚁网站SEO优化的代码,如果在调用的时候,阻塞了,那么就要等待很久
异步调用调用WebService,代码继续往下执行,WebService执行完了后,再传回到接收器对象。
7.多线程的应用,利用线程排序
排序1000个数,如果一个线程排,需要1000毫秒
如果10个线程排,则只需要大概100毫秒
,排序的时候a[i] a[i+1],只能有一个线程对他进行操作
所以,在For里面,i和i+1交换的时候,需要事先进行锁定。
for (int t = 0; t < x; t++)//X为线程数
{
Thread thread = new Thread(new ThreadStart(Sort));//Sort排序的方法
thread.Name = Convert.ToString(t);
thread.Start();
}
public void Sort()
{
try
{
while (true)
{
swaped = false;
for (int j = 0; j < valueArray.Length - 1; j++)
{
lock (typeof(Thread))//锁定
{
if (valueArray[j] > valueArray[j + 1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j + 1];
valueArray[j + 1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if (!swaped) { break; }
}
Thread.CurrentThread.Abort();
}
catch (Exception ex)
{
if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.ToString().ToString().Trim()))
Display();
}
}
线程每个工人,搬完100个砖头,就是一个任务
采用线程,异步搬
手工去搬,10个工人搬,效率高,异步执行,如果不采用线程,等第一个人搬完后第二个人才搬,那就慢了
什么时候不能用线程
如果要用小车来搬,只有一个小车,那么,在这样的情况下,就不应该用线程,因为只有一个小车,各个线程都在争夺和等待这个小车,所以不能用线程。如果这个时候还要用线程,则导致资源浪费,
因为每个线程都有自己的资源,如包工头(CPU)同一时间要管理这10个工人,而只有一个工人实际在做事。
线程的销毁在销毁的时候需要考虑一些问题,比如搬砖头时,你不可能在一个工人搬到一半的时候,你将他销毁,那砖头往哪放呢?
1..里使用线程
.里使用线程,用thread类,定义线程,启动,销毁,全部包括在这个类里定义一个线程,必须指定这个线程的函数,也就是这个线程是做什么的,搬砖头呢还是挑水
EG:
代码如下:
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
public void WorkerMethod()
{
Console.WriteLine ("AA ");
}
2.如果使用带有参数的线程
线程本身是不能带参数的,只能在类里定义一个全局变量,线程前先给这个变量赋值,然后在线程的函数里,去使用这个变量,以达到传参数的目的
EG:
代码如下:
public class SimpleThread
{
private string procParameter = "";
public SimpleThread (string strPara)
{
procParameter = strPara;
}
public void WorkerMethod()
{
Console.WriteLine ("参数输入为: " + procParameter);
}
}
class MainClass
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SimpleThread st = new SimpleThread("这是参数字符串!");
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
t.Join (Timeout.Infinite);
}
}
3.线程和委托
委托的目的类似C++的指钟,就是要把函数当做参数来传递
4.应用程序域
10个工人各自搬各自的,隔离开,不相互受影响,一个人抱怨不搬了,不影响其他人,电脑里也是一样的情况,各个应用程序间不能干扰,程序间不能访问,并且一个程序死了,整个电脑部能死机。
5.线程池
就如内存,如果工人搬砖头,突然有2个工人因为什么原因不能搬了,那么从线程池里调用其他线程来做,性能好,创建一个线程需要浪费时间和资源
6.异步调用
调用WebService为例
同步调用一个WebService时,调用完了,才执行狼蚁网站SEO优化的代码,如果在调用的时候,阻塞了,那么就要等待很久
异步调用调用WebService,代码继续往下执行,WebService执行完了后,再传回到接收器对象。
7.多线程的应用,利用线程排序
排序1000个数,如果一个线程排,需要1000毫秒
如果10个线程排,则只需要大概100毫秒
,排序的时候a[i] a[i+1],只能有一个线程对他进行操作
所以,在For里面,i和i+1交换的时候,需要事先进行锁定。
代码如下:
for (int t = 0; t < x; t++)//X为线程数
{
Thread thread = new Thread(new ThreadStart(Sort));//Sort排序的方法
thread.Name = Convert.ToString(t);
thread.Start();
}
public void Sort()
{
try
{
while (true)
{
swaped = false;
for (int j = 0; j < valueArray.Length - 1; j++)
{
lock (typeof(Thread))//锁定
{
if (valueArray[j] > valueArray[j + 1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j + 1];
valueArray[j + 1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if (!swaped) { break; }
}
Thread.CurrentThread.Abort();
}
catch (Exception ex)
{
if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.ToString().ToString().Trim()))
Display();
}
}
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指