您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > JAVA程序设计课程讲义多线程
Java多线程机制本章内容•线程的基本概念•线程的创建和启动•线程的调度和优先级•线程的状态控制•线程同步程序进程线程1,一段代码静态程序执行起来就是进程有边界可以调度CUP的资源和内存管理动态的进程内部的顺序控制流CPU分配时间片的最小单位多任务OS:多进程对进程:多线程动态的轻量级的进程线程的基本概念•线程是一个程序内部的顺序控制流•线程和进程的区别•进程是指在内存中运行的一个应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程•每个进程都有独立的代码和数据空间(进程上下文)。进程间的切换会有较大的开销•线程是指进程中的一个执行流程,一个进程中可以运行多个线程•线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序计数器(PC),线程切换的开销小•多进程:在操作系统中能同时运行多个任务(程序)•多线程:在同一应用程序中有多个顺序流同时执行线程的创建和启动线程的创建和启动•Runnable接口线程的创建和启动•Thread类线程状态•创建新创建了一个线程对象•就绪状态线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。•运行状态就绪状态的线程获取了CPU,执行程序代码•阻塞状态阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行•终止线程执行完了或者因异常退出了run()方法,该线程结束生命周期线程状态转换线程控制基本方法11简单的示例-ThreadpublicclassSimpleThreadextendsThread{publicSimpleThread(Stringstr){super(star);}//创建具以str为名字的线程publicvoidrun(){//定义run()方法for(inti=0;i10;i++){System.out.println(i++getName());try{//休眠一段时间sleep((int)(Math.random()*1000));}catch(InterruptedExceptione){}}System.out.println(DONE!+getName());}}//SimpleThread.java12简单的示例-ThreadpublicclassTwoThreadsTest{publicstaticvoidmain(String[]args){newSimpleThread(Takeitmyself??).start();newSimpleThread(Giveittopolice!!).start();}}//TwoThreadsTest.java线程状态转换run()运行结束或异常退出yield()方法sleep()wait()join()sleep()结束notify()/notifyAll()join()中断获取CPU时间线程的优先级别线程同步•在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个都对应于一个可称为“互斥锁”的标识,这个标记保证在任意时刻,只能有一个线程访问该对象。•关键字synchronized来与对象的互斥锁联系,当某个对象synchronized修饰时,表明该对象在任意时刻只能由一个线程访问。线程同步wait和sleep区别•wait时别的线程可以访问锁定对象•sleep时别的线程也不可以访问锁定对象线程状态转换18一个多线程的例子创建用户的线程子类Producer:产生数据(存数据);Consumer:消费数据(取数据)CubbyHole:共享数据区,同步方法put(intvalue)方法intget()方法主类中创建共享数据对象,并启动两线程19一个多线程的例子classCubbyHole{privateintseq;//共享数据privatebooleanavailable=false;//条件标志变量publicsynchronizedintget(){//取数据的同步方法get()while(available==false){try{wait();//条件不符合,则wait}catch(InterruptedExceptione){}}available=false;//修改条件notify();//通知唤醒其他等待管程的线程returnseq;//返回要取出的数值}//endofget()20一个多线程的例子//存放数据的同步方法put()publicsynchronizedvoidput(intvalue){while(available==true){try{wait();//条件不符合,则wait}catch(InterruptedExceptione){}}seq=value;//把共享变量修改为要放置的数据available=true;//修改条件notify();//通知唤醒其他等待管程的线程}//endofput()}//endofclassCubbyHole21一个多线程的例子classProducerextendsThread{//生产者线程类privateCubbyHolecubbyhole;privateintnumber;publicProducer(CubbyHolec,intnumber){cubbyhole=c;this.number=number;}publicvoidrun(){//定义run()方法for(inti=0;i10;i++){//共产生10个cubbyhole.put(i);System.out.println(Producer#+this.number+put:+i);try{sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}}}}//endofclassProducer22一个多线程的例子classConsumerextendsThread{//消费者线程类privateCubbyHolecubbyhole;privateintnumber;publicConsumer(CubbyHolec,intnumber){cubbyhole=c;this.number=number;}publicvoidrun(){//定义run()方法intvalue=0;for(inti=0;i10;i++){//消费10个value=cubbyhole.get();System.out.println(Consumer#+this.number+got:+value);}}}//endofclassConsumer23一个多线程的例子classProducerConsumerTest{//主类:测试publicstaticvoidmain(String[]args){CubbyHolec=newCubbyHole();//theshareddataobjectProducerp1=newProducer(c,1);//Producer线程Consumerc1=newConsumer(c,1);//Consumer线程p1.start();//启动生产者线程c1.start();//启动消费者线程}}//endofProducerConsumerTest程序执行结果:生产者线程和消费者线程严格地轮流执行,获得了线程间的协调执行。总结和回顾•进程和线程的概念•创建和启动线程Thread类和Runnable接口•线程的状态创建、可运行、运行、阻塞、死亡•线程控制的基本方法start()、run()sleep()、yield()wait()、notify()/notifyAll()•线程同步
本文标题:JAVA程序设计课程讲义多线程
链接地址:https://www.777doc.com/doc-4526434 .html