Java网络程序设计 课件 单元8-03 线程控制_第1页
Java网络程序设计 课件 单元8-03 线程控制_第2页
Java网络程序设计 课件 单元8-03 线程控制_第3页
Java网络程序设计 课件 单元8-03 线程控制_第4页
Java网络程序设计 课件 单元8-03 线程控制_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

线程应用单元八目录CONTENTS123多线程创建和使用线程线程控制线程死锁和协作目录CONTENTS5共享数据48.3.1线程控制方法

下面列举了Thread类的一些线程控制的方法:方法名作用voidstart()使该线程开始执行,Java虚拟机负责调用该线程的run()方法voidsleep(longmillis)静态方法,线程进入阻塞状态,在指定时间(单位为毫秒)到达之后进入就绪状态voidyield()静态方法,当前线程放弃占用CPU资源,回到就绪状态,使其他优先级不低于此线程的线程有机会被执行voidjoin()当前线程等待加入的(join)线程完成,才能继续往下执行。voidinterrupt()中断线程的阻塞状态(而非中断线程)voidisAlive()判定该线程是否就绪、运行和阻塞状态等活动状态。voidsetPriority(intnewPriority)设置当前线程的优先级。intgetPriority()获得当前线程的优先级8.3.2终止线程

线程通常在三种情况下会终止,最普遍的情况是线程中的run()方法执行完毕后线程终止,或者线程抛出了Exception或Error且未被捕获,另外还有一种方法是调用当前线程的stop()方法终止线程(该方法已被废弃)。importjava.util.Scanner;publicclassEndingThread{

publicstaticvoidmain(String[]args){

CountThreadt=newCountThread();

t.start();

Scannerscanner=newScanner(System.in);

System.out.println("如果想终止输出计数线程,请输入s");

while(true){

Strings=scanner.nextLine();

if(s.equals("s")){

t.stopIt();

break;

}

}

}}示例代码——通过调用线程类内部方法实现终止线程的功能://计数功能线程classCountThreadextendsThread{

privateinti=0;

publicCountThread(){

super("计数线程");}8.3.2终止线程//通过设置i=l00,让线程终止publicvoidstopIt(){

i=100;

}publicvoidrun(){

try{

while(i<100){

System.out.println(this.getName()+"计数:"+(i+i));

i++;

sleep(2000);

}

}catch(Exceptione){

e.printStackTrace();

}

}}运行结果8.3.2终止线程8.3.3线程等待和中断等待

Thread类的静态方法sleep(),可以让当前线程进入等待(阻塞状态),直到指定的时间流逝,或直到别的线程调用当前线程对象上的interrupt()方法。示例代码:publicclassInterruptThread{

publicstaticvoidmain(String[]args){

CountThreadt=newCountThread();

t.start();

try{

Thread.sleep(6000);}catch(InterruptedExceptione){

e.printStackTrace();

}

//中断线程的阻塞状态(而非中断线程)

errupt();

}}classCountThreadextendsThread{

privateinti=0;

publicCountThread(){

super("计数线程”);}publicvoidrun(){

while(i<100){

try{

System.out.printlxi(this.getName()+"计数:"+(i+1));

i++;

Thread.sleep(5000);

}catch(InterruptedExceptione){

System.out.println("程序捕获了InterruptedException异常!");

}

System.out.println("计数线程运行1次1");

}

}}运行结果8.3.3线程等待和中断等待

yield()方法:yield()方法和sleep()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU资源,把运行机会让给别的线程。yield()方法和sleep()方法的区别yield()方法sleep()方法yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。sleep()方法会给其他线程运行的机会,不考虑其他线程的优先级,因此会给较低优先级线程一个运行的机会。当线程执行了yidd()方法,将转到就绪状态。当线程执行了sleep(longmillis)方法,将转到阻塞状态,参数millis指定了睡眠时间;yield()方法没有声明抛出任何异常。sleep()方法声明抛出InterruptedException异常8.3.3线程等待和中断等待示例代码8.3.4等待其他线程完成

Thread类的join()方法,可以让当前线程等待,再加入的线程完成后,才能继续往下执行。publicclassJoinThread{publicstaticvoidmain(String[]args)throwsInterruptedException{SThreadst=newSThread();QThreadqt=newQThread(st);qt.start();st.start();}}classQThreadextendsThread{inti=0;Threadt=null;//构造方法,传入一个线程对象publicQThread(Threadt){super("QThread线程");this.t=t;}publicvoidrun(){try{while(i<100){//当i=5,调用传入线程对象的jion()方法,等传入线程执行完毕再执行本线程if(i!=5){Thread.sleep(500);System.out.println("QThread正在每隔0.5秒输出数字:"+i++);}else{t.join();}}}catch(InterruptedExceptione){e.printStackTrace();}}}classSThreadextendsThread{inti=0;//从0输出到99publicvoidrun(){try{while(i<100){Thread.sleep(l000);System.out.println("SThread正在每隔1秒输出数字:"+i++);}}catch(InterruptedExceptione){e.printStackTrace();}}}运行结果8.3.4等待其他线程完成8.3.5设置线程的优先级

线程的优先级由数字1~10表示,其中1表示优先级最高,默认值为5。尽管JDK给线程优先级设置了10个级别,但仍然建议只使用MAX_PR10RITY(级别为1)、NORM_PRIORITY(级别为5)和MIN_PRIORITY(级别为10)三个常量来设置线程优先级,让程序具有更好的可移植性。publicclassSetPriority{publicstaticvoidmain(String[]args)throwsInterruptedException{QThreadqt=newQThread();SThreadst=newSThread();//给qt设置低优先级,给st设置高优先级qt.setPriority(Thread.MIN_PRIORITY);st.setPriority(Thread.MAX_PRIORITY);qt.start();st.start();}}示例代码classQThreadextendsThread{inti=0;publicvoidrun(){while(i<100){System.out.println("QThread正在输出数字:"+i++);}}}classSThreadextendsThread{inti=0;publicvoidrun(){while(i<100){System.out.println("SThread正在输出数字:"+i++);}}}8.3.5设置线程的优先级8.3.5设置线程的优先级运行结果8.3.6守护线程

守护线程是为其他线程的运行提供便利的线程。Java的垃圾收集机制的某些实现就使用了守护线程。

程序可以包含守护线程和非守护线程,当程序只有守护线程时,该程序便可以结束运行。

如果要使一个线程成为守护线程,则必须在调用它的start()方法之前进行设置(通过以true作为参数调用线程的setDaemon()方法,可以将该线程设置为一个守护线程)。如果线程是守护线程,则isDaemon()方法返回为true。示例代码publicclassDaemonThread{

publicstaticvoidmain(String[]args){

DThreadt=newDThread();

t.start();

System.out.println("

温馨提示

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

评论

0/150

提交评论