第十章 java线程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

信息科学与工程学院软件工程系数据库应用软件Java语言编程第十章线程信息科学与工程学院软件工程系数据库应用软件Java语言编程10.1基本概念进程:一个运行的程序实例线程–由虚拟CPU、代码和数据组成–多个线程可以共享代码和数据关系:一个进程包含一个或多个线程–main:主线程虚拟CPU代码数据理解:线程是一个程序里不同的执行路径信息科学与工程学院软件工程系数据库应用软件Java语言编程publicclass{publicstaticvoidmain(String[]args){m1();}publicstaticvoidm1(){m2();m3();}publicstaticvoidm2(){}publicstaticvoidm3(){}}执行路径有几条?怎样算是多条路径?信息科学与工程学院软件工程系数据库应用软件Java语言编程10.2Java线程创建线程①继承Thread类②实现Runnable接口信息科学与工程学院软件工程系数据库应用软件Java语言编程publicclassMyThreadextendsThread{publicvoidrun(){……}}publicstaticvoidmain(…){Threadt=newMyThread();t.start();}(1)继承Thread类线程要执行的内容实例1:TestMyThread信息科学与工程学院软件工程系数据库应用软件Java语言编程(2)实现Runnable接口classHelloRunnerimplementsRunnable{inti;publicvoidrun(){i=0;while(true){System.out.println(Hello+i++);if(i==50){break;}}}}publicstaticvoidmain(Stringargs[]){HelloRunnerr=newHelloRunner();Threadt=newThread(r);t.start();}实例2:SL27513-6ThreadTester信息科学与工程学院软件工程系数据库应用软件Java语言编程(SL275)13-6扩展:NewThreadTesterpublicstaticvoidmain(Stringargs[]){HelloRunnerr=newHelloRunner();Threadt1=newThread(r);Threadt2=newThread(r);t1.start();t2.start();}思考:两种定义线程的方法中,哪一种更常用?信息科学与工程学院软件工程系数据库应用软件Java语言编程启动线程–start方法–JVM可以调度该线程,但未必立刻执行线程调度–Java的线程调度模型:抢先式publicstaticvoidmain(Stringargs[]){HelloRunnerr=newHelloRunner();Threadt=newThread(r);t.run();}方法调用:仅一个路径信息科学与工程学院软件工程系数据库应用软件Java语言编程10.3线程的状态就绪运行死亡阻塞休眠等待start()notify()I/O结束超时I/O请求wait()sleep()notifyAll()分派信息科学与工程学院软件工程系数据库应用软件Java语言编程方法功能getPriority()获得线程的优先级setPriority()设置线程的优先级Thread.sleep()使当前线程睡眠指定的时间join()将当前线程与该线程合并,即等待该线程结束,再恢复当前线程的运行yield()让出cpu,当前线程进入就绪队列wait()当前线程进入等待状态notify()/notifyAll()唤醒处于等待状态的一个或所有线程isAlive()判断线程是否还未终止信息科学与工程学院软件工程系数据库应用软件Java语言编程终止线程:完成执行并终止后,不再执行测试线程状态:isAlive–线程已启动而尚未终止访问线程优先级–getPriority/setPriority–取值:MIN_PRIORITYMAX_PRIORITY之间的值。NORM_PRIORITY值为5–根据优先级进行调度的机制信息科学与工程学院软件工程系数据库应用软件Java语言编程(1)sleep让线程终止一段时间的方法Thread类的static方法,对当前线程进行操作(在哪个线程中调用该方法,就让哪个线程sleep)说明:sleep结束后,进入就绪状态抛出的异常:InterruptedException(sleep的时候被打断时抛出该异常)实例1:ThreadTesterWithSleep实例3:TestSleep.java(终止线程的方法,SL27513-13)实例2:TestInterrupt1.java信息科学与工程学院软件工程系数据库应用软件Java语言编程(2)join当前线程等待,直到调用join方法的线程结束思考:t.join(100)与t.sleep(100)的区别?实例1:TestJoin1.java实例2:TestJoin2.java信息科学与工程学院软件工程系数据库应用软件Java语言编程(3)Thread.yield()暂停当前正在执行的线程对象,并执行其他线程停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么yield()方法将不会起作用思考:yield和sleep的区别?sleep()可使优先级低的线程得到执行的机会,yield()只能使同优先级的线程有执行的机会。实例:TestYield.java信息科学与工程学院软件工程系数据库应用软件Java语言编程(4)线程优先级Java使用线程调度器来监控程序启动后进入就绪状态的所有线程。线程调度器根据线程的优先级决定调度哪个线程。优先级高的线程得到的CPU时间片多。线程优先级的表示:数字(1-10),默认为5–Thread.MIN_PRIORITY=1–Thread.MAX_PRIORITY=10–Thread.NORM_PRIORITY=5获得和设置线程优先级的方法–getPriority()–setPriority(intnewPriority)实例:TestPriority.java信息科学与工程学院软件工程系数据库应用软件Java语言编程说明线程的优先级(Priority)告诉调试程序该线程的重要程度有多大。假如有多个线程等候运行,调试程序会首先运行具有最高优先级的那个线程。然而,并不表示优先级较低的线程不会运行。线程的优先级较低,只不过表示它被准许运行的机会小一些而已。信息科学与工程学院软件工程系数据库应用软件Java语言编程10.4线程同步为何同步?–线程可以共享数据–多个线程访问同一个对象,访问同一个方法,修改该对象的属性实例1:SL27513-2113-22实例2:TestSync.java信息科学与工程学院软件工程系数据库应用软件Java语言编程锁标志:与每个对象相关联的标志synchronized–使用该关键字与对象锁标志交互–线程调用synchronized方法时,对象转入“锁定”状态–保护机制:加锁标志、释放锁标志publicvoidpush(charc){synchronized(this){data[idx]=c;idx++;}publicsynchronizedvoidpush(charc){data[idx]=c;idx++;}说明:普通方法访问前不需要得到锁标志实例:TestCommonMethod.java信息科学与工程学院软件工程系数据库应用软件Java语言编程10.5死锁死锁的概念Java中死锁的处理方式–保证不产生死锁是程序员的责任实例1:TestDeadLock.java信息科学与工程学院软件工程系数据库应用软件Java语言编程10.6线程交互生产者-消费者问题wait方法(Object类)–当前对该对象访问的线程wait,释放对象的锁,并被放入该对象的等待池;–只有得到对象锁的线程才能调用wait,因此调用wait的语句必须位于synchronized语句块中;–由其他线程调用notify/notifyAll方法唤醒notify:唤醒一个正在wait的线程notifyAll:唤醒所有的正在wait的线程实例:ProducerConsumerDemo.java信息科学与工程学院软件工程系数据库应用软件Java语言编程生产者-消费者实例2:SL27513-38~13-47重点类:SyncStack.java由于栈的内部数据结构采用了ArrayList,因此只考虑pop中的wait,而push中仅notify即可;理解:pop实现代码中的while。信息科学与工程学院软件工程系数据库应用软件Java语言编程10.7哲学家吃饭问题问题描述实现–Dining:生成philosoper对象和筷子对象并运行–Philosopher:哲学家线程–ChopStick:筷子

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功