第十五讲线程的管理_第1页
第十五讲线程的管理_第2页
第十五讲线程的管理_第3页
第十五讲线程的管理_第4页
第十五讲线程的管理_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十五讲线程的管理一、线程的常用属性:isalive属性:获収当前线程的执行状态。已启动并且尚未正常终止,则为true;否则为false0 name属性:获取或设置线程的名称。线程的命名static void main()thread.currentthread.name = "main"/将当前的线程命名为 mainthread worker = new thread(go);/创建一个线程 worker worker.name = "worker"将线程 worker 命名为 workerworker.start();/线程 worker 开始运行g

2、o(); 主线程开始运行)static void go()console.writeline(h 由"+thread.currentthread.name +"开始”);注意:线程的name属性设置后不能修改。isbackground属性:获取或设置线程是否为后台线程。前台线程与后台线程,默认的线程为前台线程,主线程结束时,它创建的前台线程不会 自动结束,一个应用程序只要有一个线程没有结束,应用程序就不会结束。可将线程的属性 改为true,将它设置为后台线程,主线程结束时,它创建的后台线程会自动结束。public partial class forml : formthre

3、ad t;public forml ()initializecomponent();checkforl1legalcrossthreadcalis 二false ; t 二 new threcid (go);t.isbackground = true;private void buttonlclick(object sender, eventargs e)if(t. tsalive =false )t. start 0 ;void go ()int i=0;while (true)i卄;label 1. text = i. tostringo ;private void button2_cli

4、ck(object sender, eventargs e)this. close ();priority属性:获取或设置线程的调度优先级。highest (高)、abovenormal (高于一般)、normal (一般)、belownormal (低于一般)、lowesto (低) 高优先级的线程通常会比一般优先级的线程得到更多的cpu时间。低优先级的线程在执行时遇到了高优先级的线程,它将让出cpu给高优先级的线程。 新创建的线程优先级为一般优先级。threadstate屈性:获取当前线程的状态。un started (未启动)、running (运行)、waitsleepjoin (休眠

5、)、 suspendrequested (正被请求挂起)、suspended 状态(挂起)、 abortrequested (正被请求终止)、stopped (已停止)。线程被创建时处于未启动状态,调用线程对象的start。方法,可使该线程状态变为运行 状态,线程被销毁或者终止,处于己停止状态。当前运行屮的线程调用sleep方法,将使z处于休眠状态。线程将暂停运行,直到sleep 方法设左的时间到后,重新冋到running状态。或者被其他的线程通过调用thread.intenupt ()或者thread.abort ()方法唤醒,重新回到running状态。调用线程对象的suspend方法,可

6、使之处于挂起状态。若调用挂起的线程的resume () 方法使其重新变为running状态。二、线程常用的方法:interrupt ():中断处于waitsleepjoin状态的线程;join ():阻塞调用线程,直到某个线程终止时或经过了指定的时间为止;resume ():继续已挂起的线程;sleep ():将当前线程暂停一段吋i'可,单位毫秒数;注意:该方法为静态成员。start ():启动线程的执行;suspend ():挂起线程;abort ():终止线程的状态。三、join与sleep的区别:static void main()thread.sleep(o);/放弃 cpu

7、时间片thread.sleep(looo);/暂停 1000 毫秒thread.sleep(timespan.fromhours( 1);/ 暂停 1 小吋thread.sleep(timeout.infinite);/ 暂停到被打断sleepo方法为thread类的静态方法,调用thread.slcep(o)将当前线程进入休眠状态。static void main()thread t = new thread(delegate() console.readline(); );t.start();t.join();/当前线程进入休眠状态直到线程t结束 console.writeline(&qu

8、ot;thread trs readline complete!0);注意:join()方法为实例化方法。运行结果:等待用于输入后,输出。static void main()thread t = new thread(delegate() console.readline(); );t.start();t.join(iooo);/当前线程进入休眠状态1000亳秒console.writeline(hthread trs readline complete!h);)运行结果:等待用于输入后,输出;若等待时间较长,则先输出后再等待。static void main()thread t = new

9、thread(delegate() console.readline(););t.isbackground = true;t.start();t.join(looo);console.writeline(”thread tfs readline complete!”);运行结果:等待用于输入后,输出;若等待时间较长,则先输汕后结束。四、线程的中断与取消休眠状态中的线程可以通过inteirupt方法中断休眠,重新回到运行状态,但会抛出一个threadlnterruptedexception异常,用丿、'可以通过捕获这个异常结束进程。static void main()thread t =

10、 new thread(p);t.start ();t.intenupt ();/'|* 断线程 t)static void p()trythread.sleep(timeout.infinite);/ 暂停到被打断catch (threadlnteituptedexception)console.write("强制执行”);1console.writeline(h完成! ”);运行结果:强制执行一个处于挂起状态的线程也可以通过使用abort方法而强行释放资源,但会抛出一个 threadabortexception异常,用户可以通过捕获这个异常结束进程。五. 管理线程thre

11、ad nowthroad;public form2()tnitiali zecomponent();checkfori11egalcrossthreadcal1s = false;nowthroad = now thread(do);public void do()for (int i = 0; ; i+)if (i > 10000) i = 0;labell. text = i. tostring();private void buttonl click(object sender, evontargs c)newthread. start ();private void button

12、2 click(object sender, eventargs e)private void button3 click (objectsender,eventargse)thread. sleep(5000);private void button4_click(objectsen der,eventargse)newthread. join(5000);private void buttons click(objectsender,eventargsnewthread suspend();private void button6_click(objectsender,eventargsn

13、ewthread. resume();存在的问题:未结束线程时,直接关闭窗口,会报错。 原因是会出现线程访问不存在的控件。六.跨线程访问控件bool stop;thread newthread;delegate void delegateupdate(int i);public form2()in itializecomp on ent(); newthread = new thread(do);void update_label(int i)label 1 .text = i.tostringo;public void do()for (int i = 0; i+)if(i> 1000

14、0)1 = 0;delegateupdate updatelabel = new delegateupdate(update_label); label l.invoke (updatelabel,i);if (stop) break;private void button l_click(object sender, eventargs e)stop = false;newthread.start();private void button2_click(obj ect sender, eventargs e)stop = true;只有创建用户控件的线程才能安全地访问或更新这些控件,若在线

15、程内部更新由其他线 程创建的控件,应使用invoke方法,即暂停当前线程,在创建控件的线程上执行指定的委 托,保证访问控件时控件一定是存在的,从而实现线程i'可访问控件的安全交互。public partial class forml : formthread newthread;delegate void update(int i);定义一个委托类型update up;定义一个委托类型的变量public form 1 () initializecomponent();/checkforlllegalcrossthreadcalls = false; newthread = new th

16、read(new threadstail(do); newthread.isbackground = true;up += new update(updatelabel);/将委托类型的变量指向方法定义一个方法,完成label 1的显示void updatelabel(int i)label 1.text = i.tostringo;)public void do()for (int i = 0; i+)if(i> 10000)i = 0;object param = new objectfl i ;定义一个对象类的数组param,存入一个对象,对象的值为ilabell.invoke(u

17、p, param);在创建label 1的线程中执行委托,传递参数/up(i);/执行委托并传递参数private void button3_click(object sender, eventargs e)n ewthread.start();private void button6_click(object sender, eventargs e)newthread.abort();private void button 1 _click(object sender, eventargs e)n ewthread.suspe nd();private void button4_click(

18、object sender, eventargs e)newthread.resume();private void button2_click(object sender, eventargs e)thread.sleep(5000);private void button5_click(object sender, eventargs e)newthread.join();)七.线程同步共同完成某一个任务的多个线程之间,可以相互传递消息,实现同步。用于线程间同步的类如:monitor类,排他锁常用方法:enter()进入临界资源。exit()释放临界资源。wait()等待临界资源。plus

19、e()唤醉等待临界资源的进程。using system;using system collections generic;using systemlinq;using system .text;using system .threading;namespace consoleapplication7class zb/7帐木public int lp = 0; /领票publ ic int sp = 0; /售票public int syp = 0; /剩余class monitorsampleprivate zb zb = new zb();/新建一个帐本public void addcp0 领票方法monitoi'. enter (zb); 进入临界区int i = zb. lp + 1;int j = zb.syp + 1;thread. sleep(50);zb. lp = i;zb. syp = j;卖出车票总卖出车票总console. wri telinec新领车票,领到车票总数:"+ zb. lp. tostring () +数:"+ zb. sp. tostring () + "剩余车票总数为:"+ zb. syp. tostringo);monitor. pulse (zb);/唤醒等待的进程moni

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论