说说C#多线程那些事-线程基础
作者:网络转载 发布时间:[ 2016/4/29 13:35:02 ] 推荐标签:测试开发技术 编程语言
2、线程的创建
using System;
using System.Threading;
namespace Threading
{
class Program
{
public static void Thread1()
{
Console.WriteLine("Thread1 starts");
}
public static void Thread2(object data)
{
Console.WriteLine("Thread2 starts,para:{0}", data.ToString());
}
static void Main(string[] args)
{
var t1 = new Thread(Thread1);
t1.Start();
var t2 = new Thread(Thread2);
t2.Start("thread2");
Console.ReadKey();
}
}
}
输入:
Thread1 starts
Thread2 starts,para:thread2
3、线程的管理
sleep()挂起和Abort() 销毁线程
通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块
using System;
using System.Threading;
namespace Threading
{
class Program
{
public static void Thread1()
{
Console.WriteLine("Thread1 starts");
Console.WriteLine("Thread1 Paused for 5 seconds");
Thread.Sleep(5000);
Console.WriteLine("Thread1 resumes");
}
static void Main(string[] args)
{
var t1 = new Thread(Thread1);
t1.Start();
Console.ReadKey();
}
}
}
using System;
using System.Threading;
namespace Threading
{
class Program
{
public static void Thread1()
{
try
{
Console.WriteLine("Thread1 starts");
for (int i = 0; i <= 10; i++)
{
Thread.Sleep(500);
Console.WriteLine(i);
}
Console.WriteLine("Thread1 Completed");
}
catch (ThreadAbortException ex)
{
Console.WriteLine("Thread1 Abort Exception");
}
finally
{
Console.WriteLine("Couldn't catch the Thread1 Exception");
}
}
static void Main(string[] args)
{
//开启子线程
var t1 = new Thread(Thread1);
t1.Start();
//主线程挂起2s
Thread.Sleep(2000);
//终止t1子线程
t1.Abort();
Console.ReadKey();
}
}
}
销毁代码执行结果:
四、线程池
在多线程程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应我们一般用ThreadPool(线程池)来解决;线程平时都处于休眠状态,只是周期性地被唤醒我们使用使用Timer(定时器)来解决。
由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。线程池维护一个请求队列,线程池的代码从队列提取任务,然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。线程池线程默认为后台线程。
线程池自动管理线程线程的创建和销毁。
代码展示:
using System;
using System.Threading;
namespace Threading
{
class Program
{
public static void Thread1(object data)
{
Console.WriteLine("Thread1 => {0}",data.ToString());
}
static void Main(string[] args)
{
//控制线程数大小
//第一个参数是:线程池中辅助线程的大数目
//第二个参数是:线程池中异步 I/O 线程的大数目
ThreadPool.SetMaxThreads(3, 3);
for (int i = 0; i < 10; i++)
{
//ThreadPool是静态类无需实例化,
//ThreadPool.QueueUserWorkItem(new WaitCallback(Thread1), i);
ThreadPool.QueueUserWorkItem(Thread1, i);
}
Console.WriteLine("Thread1 sleep");
Thread.Sleep(100000);
Console.WriteLine("Thread1 end");
Console.ReadKey();
}
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11