资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
4.1创建及控制线程主讲教师:胡祝华1一、知识能力目标l1掌握线程概念及其实现机制;l2掌握线程属性及其方法;l3掌握线程的创建、运行、阻塞和终止。l4能创建具有线程的Java程序 2二、项目28 简单的多线程程序 l使用一个线程用于计时,并使用另一个线程完成工作。在 这个实例中,由run()方法实现的线程用于打印信息,由 main()方法创建的主线程用于计时,这个线程一开始休眠 10秒再开始执行。 3run()方法 main()方法 创建 主线程打印运算结果计时项目29 简单的多线程程序 SimpleThread.java 图示41.程序代码/SimpleThread.java public class SimpleThread extends Thread public static boolean f=false; /*声明变量f成为控制线程运行的标志*/public void run() /*为线程创建run()方法*/ work(); /*如果想让线程完成不同的工作,只要修改work()方法*/ private void work()/创建并实现work()方法,本例中work方法的功能是输出进行加法运算的次数 for(long i=1;i+)if(f=true) System.out.println(“进行了“+i+“次加法运算“); break; 5public static void main(String args) SimpleThread r=new SimpleThread (); r.start(); /*调用start()方法运行run()方法从而启动线程*/ try Thread.sleep(10000); /*计时,主线程休眠10秒后再次开始运行*/ catch (InterruptedException e) f=true; 62.相关知识 程序、进程、线程和多任务l程序(program)l对数据描述与操作的代码的集合l应用程序执行的脚本。7l进程(process)l程序的一次执行过程l操作系统运行程序的基本 单位l系统运行一个程序就是一 个进程从创建、运行到消 亡的过程l系统可以为一个程序同时 创建多个进程8多任务图解多任务(multi task) 一个系统中可以同时运行多 个程序,即有多个独立运行 的任务,每个任务对应一个 进程 9l线程(thread)l比进程更小的运行单位l程序中单个顺序的流控制l一个进程可以被划分成多个线程l线程与程序l相同点:有开始、一系列可执行的命令序列、一个结 束。在执行的任何时候,只有一个执行点l不同点:线程本身不能运行,只能包含在程序中,在 程序中执行。一个线程在程序运行时,必须争取到为 自己分配的系统资源。l多线程(相对于单线程而言)l在一个程序中可以定义多个线程并同时运行它们,每个线 程可以执行不同的任务。l与进程不同:同类多线程共享一块内存空间和一组系 统资源,所以系统创建多线程开销相对较小。因此, 也称线程为轻负荷进程。l把程序分解成彼此独立的子任务,每一个独立的子任务由 一个线程来完成10用new运算符创 建的是一个空的 线程对象,系统 不为它分配资源 系统分配了它所需 的资源,并调用线 程运行的方法 万事具备只欠CPU线程占有 CPU真正开 始工作 万事具备由于某种原因 系统不能执行 线程的功能执行结束 自然撤消被停止 线程正 常退出 应用程序 停止运行 输入输出、等待消息或其他资源 不可用等情况线程生命周期图解11l创建线程和启动线程的区别l在一个线程对新线程的Thread对象调用start()方法之前 ,这个新线程并没有真正开始执行lThread对象在其线程真正启动之前就已经存在了,而且 其线程退出之后仍然存在。lmain()方法中可以创建若干个Thread类或者它的子类的 对象,并且不设置这些对象中的任何引用lJava的垃圾收集器一般并不会清理这些对象 ,只有在线程离开了run()并且死亡之后才把 它们清除。l不建议在构造器中通过start()方法启动线程l暴露了部分构造的对象给新线程,从封装的角度看是不 可取的。l如果对象拥有一个线程,那么它应该提供一个启动该线 程的start()或init()方法,而不是在构造器中启动它 12应用拓展l主线程由main()创建,程序开始运行,在运行过程中另一 个线程需要立即运行,主线程为这个线程让步,暂停运行 ,等待这个抢先运行的线程结束后再继续运行 131.程序代码/ Joinexam.java class Thread1 extends Thread public Thread1() start(); /Thread1对象实例化的时候就会开始执行线程 public void run() for(int i=1;i=3;i+)/*使用getName()方法获得当前线程的名称*/ System.out.println(“线程“+this.getName()+“运行 了“+i+“秒“); /*本程序块控制程序每次完成输出后休眠1秒*/try sleep(1000); /当前线程进入阻塞状态,阻塞时间为1秒 catch (InterruptedException e) System.out.println(“线程“+this.getName()+“结束“); 14public class Joinexam public static void main(String args) Thread1 t1=new Thread1(); /创建线程t1for(int i=1;i=3;i+)System.out.println(“主线程运行了“+i+“秒“);try /*在主线程上调用t1.join()意味着要等t1的线程结束后主线程才恢复*/ t1.join(); catch (InterruptedException e2) try /*本程序块控制主线程每次完成输出后休眠1秒*/Thread.sleep(1000); /Example_03不是Thread类的子类, 应该这样调用catch (InterruptedException e1) System.out.println(“主线程结束“); 15( 1 ) sleep ()方法Sleep(n)方法使当前线程休眠n毫秒,线程由运行中状态进入阻塞 状态,休眠时间过后线程再次进入运行状态。(2)yield()方法yield()方法引起当前线程暂停运行,允许其他同优先级线程运行, 前线程仍然处于可运行状态;若无其他线程可运行,则当前线程继 续运行。 (3)join()方法join()方法使当前线程暂停运行,调用join()方法的线程结束后当前 线程再继续运行l join():等待调用本方法的线程结束后在执行当前线程。l join(long n):等待调用本方法的线程结束或者最多等待n毫秒 后(n毫秒为超时时间,以避免永远等待下去)在执行当前线程l join(long n,int m):等待调用本方法的线程结束或者最多等待n 毫秒加m纳秒后在执行当前线程。2.相关知识 常见的引起线程状态改变的方法 由Thread类继承而来的方法16(4)interrupt()方法中断线程组中所有线程或当前线程的阻塞状态,抛出 并捕捉这个InterruptedException异常进行处理。 (5)suspend()方法使当前线程暂停执行,要恢复执行的话必须使用 resume()方法。 (6)resume()方法恢复被suspend()方法方法暂停的线程。 (7)stop()方法使当前线程停止,进入死亡状态。常见的引起线程状态改变的方法 由Thread类继承而来的方法17常见的引起线程状态改变的方法Java.lang.Object类中的控制线程的方法(8)wait()方法wait():使当前线程暂停运行,等待别的方法唤醒后线程再 次运行。wait(long n):使当前线程暂停运行,等待别的方法唤醒后 线程再次运行,或者进入阻塞状态最多n毫秒后可自动恢 复运行。 (9)notify()方法唤醒被wait()暂停的一个线程继续运行。 (10)notifyAll()方法唤醒被wait()暂停的所有进入等待序列的线程继续运行 18运行状态阻塞状态调用sleep(n)n ms后suspend()暂停当前线程执行 resume()恢复执行wait()暂停当前线程执行 notify()恢复一个线程执行notifyAll()恢复所有进入 等待序列线程执行l线程进入阻塞状态的几种情况l线程在等待某个输入/输出的完成;l线程试图在某个对象上调用其同步控制方法,但是 对象的锁不可用。常用于非 同步控制易造成死锁, 不推荐使用常用于同 步控制19
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号