第四十一讲 深入线程(操作线程的,执行,挂起,恢复,关闭 及 Join的用法)
来源:互联网 发布:自然哲理 知乎 编辑:程序博客网 时间:2024/05/29 16:26
主要内容
1. Thread类
先引用空间名System.Threading
语法:
Thread 线程实例名=new Thread(new ThreadStart(方法名));
线程实例名.Start();
Thread类有几个至关重要的方法:
1. Start()
2. Sleep(int)
3. Abort()
4. Suspend
5. Resume()
在创建托管的线程时,在该线程上执行的方法将通过一个传递给Thread构造函数的ThreadStart委托或ParameterizedThreadStart委托来表示
Thread(ParameterizedThreadStart):初始化Thread类的新实例,指定允许对象在线程启动时传递给线程的委托。
Thread(ThreadStart):使用ThreadStart类型的参数,初始化Thread类的新实例。
public delegate void ParameterizedThreadStart(object obj)
public delegate void ThreadStart()
2. 线程的挂起与恢复
临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的播放)
主线程中挂起线程如:
线程实例名.Suspend();
恢复线程,如:
线程实例名.Resume();
3. 终止线程
如需要退出该线程,如:
线程实例名.Abort();
如果后续的处理依赖于另一个已经中止的线程,可以调用join()方法,等待线程终止,如:线程实例名.Abort();
线程实例名.Join();
Join()方法:当前线程调用另的线程Join时,当前线程就会进入等待状态,等待调用线程完成操作后,当前线程才能继续执行。
1. Thread类
先引用空间名System.Threading
语法:
Thread 线程实例名=new Thread(new ThreadStart(方法名));
线程实例名.Start();
Thread类有几个至关重要的方法:
1. Start()
2. Sleep(int)
3. Abort()
4. Suspend
5. Resume()
在创建托管的线程时,在该线程上执行的方法将通过一个传递给Thread构造函数的ThreadStart委托或ParameterizedThreadStart委托来表示
Thread(ParameterizedThreadStart):初始化Thread类的新实例,指定允许对象在线程启动时传递给线程的委托。
Thread(ThreadStart):使用ThreadStart类型的参数,初始化Thread类的新实例。
public delegate void ParameterizedThreadStart(object obj)
public delegate void ThreadStart()
2. 线程的挂起与恢复
临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的播放)
主线程中挂起线程如:
线程实例名.Suspend();
恢复线程,如:
线程实例名.Resume();
3. 终止线程
如需要退出该线程,如:
线程实例名.Abort();
如果后续的处理依赖于另一个已经中止的线程,可以调用join()方法,等待线程终止,如:线程实例名.Abort();
线程实例名.Join();
Join()方法:当前线程调用另的线程Join时,当前线程就会进入等待状态,等待调用线程完成操作后,当前线程才能继续执行。
Join方法有两个版本,一个是不带参数的,调用如:Join(),一种是带有时间参数的,调用如:Join(20),此时Join的方法里面的时间表示当前线程最多能等待调用 线程的毫秒数,如果超过这个时间,那么当前线程就不等了继续往下执行。
操作线程的,执行,挂起,恢复,和关闭
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Con41{ class Program { static void Main(string[] args) { //如果你多测试几下,你会发现一个现象,除主线程外,的其它辅助线程的执行顺序有时会乱 Console.WriteLine("我是主线程,我就是默认的线程,老大就是我了!\n"); Thread.Sleep(500);//如果我每个线程之间都加一点延时呢 Instance instance=new Instance(); Thread newThread = new Thread(instance.noneInstance1); newThread.Start(); newThread = new Thread(instance.noneInstance2); newThread.Start("我是有参数的实例方法"); newThread = new Thread(Instance.noneStatic1); newThread.Start(); newThread = new Thread(Instance.noneStatic2); newThread.Start("我是有参数的静态方法"); Thread.Sleep(1000);//如果我每个线程之间都加一点延时呢 Console.WriteLine("\n******************下面的实例跟上面相同的结果**************\n"); newThread = new Thread(new ThreadStart(instance.noneInstance1));//这个跟第一个相同 newThread.Start(); //但是使用ParameterizedThreadStart这个委托来调用无参数的实例方法 //newThread = new Thread(new ParameterizedThreadStart(instance.noneInstance1)); //因为这个委托系统定义是带参数的,相对来说上面那个ThreadStart这个委托系统定义是无参数的 newThread = new Thread(new ParameterizedThreadStart(instance.noneInstance2)); newThread.Start("ParameterizedThreadStart这个委托系统定义时是带参数的。我是实例方法"); //上面两个现象应用静态方法是同理的 newThread = new Thread(new ThreadStart(Instance.noneStatic1));//这个跟第三个相同 newThread.Start(); newThread = new Thread(new ParameterizedThreadStart(Instance.noneStatic2)); newThread.Start("ParameterizedThreadStart这个委托系统定义时是带参数的。我是静态方法"); Thread.Sleep(2500);//如果我每个线程之间都加一点延时呢 Console.WriteLine("\n******************测试一下挂起和恢复**************\n"); Thread Test = new Thread(threadTtest); Thread Test2 = new Thread(threadTest2); Test.Start(Test);//Test开始执行 Thread.Sleep(1000);//一秒后观察Test状态 Console.WriteLine("Test当前线程的状态是:{0}", Test.ThreadState.ToString()); Test2.Start(Test2);//在test挂起时执行test2 Thread.Sleep(500);//0.5秒后恢复Test Test.Resume();//test恢复执行 //观察Test2的状态 Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString()); Thread.Sleep(1000);//一秒后观察Test 和 Test2的状态 Console.WriteLine("Test当前线程的状态是:{0}", Test.ThreadState.ToString()); Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString()); //恢复Test2 Test2.Resume(); Thread.Sleep(500);//0.5秒后再观察Test2的状态 Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString()); Console.ReadKey(); } public static void threadTtest(object o) { Thread t = o as Thread; Console.WriteLine("Test当前线程的状态是:{0}",t.ThreadState.ToString()); for (int i = 0; i < 20; i++) { Console.WriteLine(i); if (i == 10) { t.Suspend();//挂起当前线程 } } } public static void threadTest2(object o) { Thread t = o as Thread; Console.WriteLine("Test2当前线程的状态是:{0}", t.ThreadState); for (int i = 0; i < 20; i++) { Console.WriteLine(i); if (i == 10) { t.Suspend();//挂起当前线程 } else if (i == 15) { t.Abort();//关闭TEst2线程 } } } } /// <summary> /// 一个实例类 /// </summary> public class Instance { public void noneInstance1() { Thread.Sleep(500);//如果我每个线程之间都加一点延时呢 Console.WriteLine("我是新线程中无参数的实例方法\n"); } public void noneInstance2(object str) { Thread.Sleep(600);//如果我每个线程之间都加一点延时呢 Console.WriteLine("我是新线程中有参数的实例方法,我携带的参数内容是:{0}\n",str); } public static void noneStatic1() { Thread.Sleep(700);//如果我每个线程之间都加一点延时呢 Console.WriteLine("我是新线程中无参数的静态方法\n"); } public static void noneStatic2(object str) { Thread.Sleep(800);//如果我每个线程之间都加一点延时呢 Console.WriteLine("我是新线程中带参数的静态方法,我携带的内容是:{0}\n",str); } }}
补充Join的用法:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Con412{ class Program { //定义两个全局线程变量 static Thread t1; static Thread t2; static void Main(string[] args) { t1 = new Thread(t1Test); t2 = new Thread(t2Test); t1.Start(); t2.Start(); Console.ReadKey(); } public static void t1Test() { for (int i = 0; i < 5; i++) { Console.WriteLine(i+"-->A"); if (i >= 2) {//这里在调示时有一现象,当我设置大于等时,执行的结果并不是我要的结果 //只有i==2时才能成功显示预想的结果 t2.Join(); } } } public static void t2Test() { for (int i = 0; i < 5; i++) { Console.WriteLine(i+"-->B"); } } }}
0 0
- 第四十一讲 深入线程(操作线程的,执行,挂起,恢复,关闭 及 Join的用法)
- 线程的挂起join
- 线程的挂起和恢复
- 线程的挂起与恢复
- 线程的挂起与恢复
- 线程的挂起与恢复
- 线程的挂起与恢复
- 第四十二讲 深入线程-续 (并发线程测试及lock的使用)
- linux线程的挂起与恢复
- Linux下线程的挂起和恢复
- C# 线程的挂起与恢复
- CPrcThread<Worker>线程的挂起和恢复
- linux 线程挂起恢复的简单示例
- [MFC]线程的挂起与恢复
- Android : 线程的结束,挂起和恢复
- linux 线程挂起恢复的简单示例
- Android 线程的结束,挂起和恢复
- Android: 线程的结束,挂起和恢复
- 更改eclipse(myeclipse) author的默认名字(注释的作者)
- 代码资源
- GC 收集器算法总结
- wifi共享开启关闭代码
- Secret Number
- 第四十一讲 深入线程(操作线程的,执行,挂起,恢复,关闭 及 Join的用法)
- CyanogenMod 7
- C/C++中创建线程 -2013-09-20 12:46
- js生成日历
- 传球游戏 动态规划
- Python解析XML文档
- csdn外链工具,QQ1922028080自动收录,自动删除群发必备,召
- zigbee组网原理
- 黑马程序员_日期(二)——Calendar