版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 多线程第七章 多线程n7.1 操作系统的进程与线程n7.2 Java的线程对象n7.3 线程的同步与通信n7.4 小结7.1 操作系统的进程与线程文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段只有一个地方在执行只有一个地方在执行文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段同时有数个地方在执行同时有数个地方在执行传统的进程传统的进程多线程的任务多线程的任务进程:一个程序的执行状态线程:程序中单个顺序的流控制多线程:指单个程序中可以同时运行多个不同的线程,执行不同的任务。7.1 操作系统的进程与线程n线程
2、与进程的区别:n多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.n线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。7.1 操作系统的进程与线程n对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术.n虽然Macintosh,Windows NT,Windows 9等操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.7.1 操作系统的进程与线程n多线程的优越性减轻编写交互频繁、涉及面多的程序的困难.程序的吞吐量
3、会得到改善.由多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行)7.2 Java的线程对象Java的线程机制-两种产生线程的方式1. public class mythread extends Applet implements Runnable (小应用或已经是某个类的子类时)2. 继承类继承类Thread public class mythread extends Thread3. 上述两种方法中都可用类Thread产生线程的对象 Thread newthread;4. 创建并启动线程 newthread=new Thread(this); newthread.
4、start();通过继承Thread类构造线程n线程的创建与启动 (步骤) P 166 例题7-1n创建一个类继承Threadn将线程中要执行的代码写在run()方法中,覆盖父类中的run()n创建一个线程类对象n调用start()方法启动线程,自动运行run()方法。通过继承Thread类构造线程n线程的暂停和恢复例7-2nsleep() 让线程休眠一段时间nyield() 暂时中断当前正在执行中的线程nwait() 使线程进入等待状态,直到被另一个线程唤醒。nnotify()唤醒一个线程nstop() 方法停止一个线程注意:sleep要丢出异常,必须抓住Trysleep(100)catch
5、(InterruptedException e) import java.applet.*;public class thread extends Applet mythread t1=new mythread(); public init() t1.start();class mythread extends Thread public void run() for (int i=0;i4;i+) System.out.println( “”+i); trysleep(400); catch(InteruptedException e) 通过继承Thread类构造线程举例通过继承Thread
6、类构造线程public class mainclass extends Applet C t1=new C(this); public void init() t1.start(); public void paint(Graphics g) g.drawString(Hello,java,10,50);class C extends Thread mainclass a;C(mainclass b) a=b; public void run() while(true) a.repaint();trysleep(400); catch(InterruptedException e) 通过继承T
7、hread类构造线程其它常用的方法 isAlive :判断线程目前是否正在执行状态中 if(newthread.isAlive() newthread.stop(); resume:要求被暂停得线程继续执行 suspend:暂停线程的执行 join:等待线程执行完毕 thatThread.join();被等待的那个线程不结束,当前线程就一直等待. yield:将执行的权力交给其它线程,自己到队列的最后等待.通过继承Thread类构造线程线程的优先权n某一时刻只有一个线程在执行,调度策略为固定优先级调度.newthread.setPriority(Thread.MIN_PRIORITY)n级别有
8、:MIN-PRIORITYn NOM_PRIORITYn MAX-PRIORITY自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.线程对象的生命周期线程的状态 P175-176new Thread()New ThreadRunnablestart()stop()stop()DeadSuspend() sleep() wait()RunningnotRunnableNotify()Resume()run()stop()stop()over线程对象的生命周期n当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。n如果希望线程正常终止,可采用标记来使
9、线程中的run()方法退出。通过实现Runnable接口来构造线程 关于Runnable接口P 173 例7-3 public class Xyz implements Runnable private boolean timeToQuit=false; public void run()() while (!timeToQuit) . /clean up before run() ends; public void stopRunning() timeToQuit=true; 通过实现Runnable接口来构造线程public class ControlThread private Runn
10、able r=new Xyz(); private Thread t=new Thread(r); public void startThread() t.start(); publi void stopThread() r.stopRunning();7.3 线程间的通信1. 线程间的通信可以用管道流,.创建管道流:PipedInputStream pis=new PipedInputStream();PipedOutputStream pos=new PipedOutputStream(pis);或:PipedOutputStream pos=new PipedOutputStream()
11、;PipedInputStream pis=new PipedInputStream(pos);线程线程1PipedOutputStream PipedInputStream输出流输出流outStream输入流输入流inStream线程线程27.3 线程间的通信n管道流不能直 接读写PrintStream p = new PrintStream( pos );p.println(“hello”);DataInputStream d=new DataInputStream(pis);d.readLine();n2. 通过一个中间类来传递信息.线程线程2线程线程1中间类中间类mssm.write(
12、s)s=m.read()write()read()printStream DataInputStream7. 3线程间的通信n管道流可以连接两个线程间的通信n下面的例子里有两个线程在运行,一个往外输出信息,一个读入信息.n将一个写线程的输出通过管道流定义为读线程的输入.outStream = new PipedOutputStream();inStream = new PipedInputStream(outStream);new Writer( outStream ).start();new Reader( inStream ).start(); 7.3线程间的通信主类主类Pipethrea
13、d辅类辅类Writer线线程程类类辅类辅类Reader线线程程类类管管道道流流将数据写将数据写到输出流到输出流从流中读数据从流中读数据输入流输入流作为参数传给作为参数传给WriterWriter( outStream )7.3-线程间的通信n.class Writer extends Thread private PipedOutputStream outStream;/将数据输出将数据输出 private String messages = Monday, Tuesday , Wednsday, Thursday,Friday :, Saturday:,Sunday :; public Wr
14、iter(PipedOutputStream o) outStream = o; public void run() PrintStream p = new PrintStream( outStream ); for (int i = 0; i messages.length; i+) p.println(messages i ); p.flush(); System.out.println(WrIte: + messagesi ); p.close(); p = null; 7.3-线程间的通信class Reader extends Thread private PipedInputStr
15、eam inStream;/从中读数据从中读数据 public Reader(PipedInputStream i) inStream = i; public void run() String line; DataInputStream d; boolean reading = true; try d = new DataInputStream( inStream ); while( reading & d != null) tryline = d.readLine(); if( line != null ) System.out.println( ”Read: + line );
16、else reading = false; catch( IOException e) catch( IOException e ) System.exit(0); try Thread.sleep( 4000 ); catch( InterruptedException e )7.3-线程间的通信n.public class Pipethread public static void main(String args) Pipethread thisPipe = new Pipethread(); thisPcess(); public void process() Piped
17、InputStream inStream; PipedOutputStream outStream; PrintStream printOut; try outStream = new PipedOutputStream(); inStream = new PipedInputStream(outStream); new Writer( outStream ).start(); new Reader( inStream ).start(); catch( IOException e ) 7.3 线程同步1. 数据的完整性线程线程1线程线程2线程线程10资源资源取过来取过来加加1后送回去后送回去
18、withdrwal()withdrwal()透支透支余额余额变量变量7.3 线程同步n对共享对象的访问必须同步nJava语言允许通过监视器监视器(有的参考书称其为管程)使用条件变量条件变量实现线程同步.n监视器阻止两个线程同时访问同一个条件变量.它的如同锁一样作用在数据上.n线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入.withdrawal()线程线程1监视器监视器线程线程27.3 线程同步n用synchronized来标识的区域或方法即为监视器监视的部分。一个类或一个对象有一个监视器,如果一个
19、程序内有两个方法使用synchronized标志,则它们在一个监视器管理之下.n一般情况下,只在方法的层次上使用关键区readwrite监监视视器器线程线程1线程线程27.3 线程同步此处给出的例子演示两个线程在同步限制下工作的情况.class Account statics int balance=1000; /为什么用static? statics int expense=0; public synchronized void withdrawl(int amount) if (amount=balance) balance-=amount; expense+=amount; else S
20、ystem.out.println(“bounced: “+amount); 7.3 线程同步n2. 等待同步数据生产者生产者消费者消费者.共享对象共享对象writeread可能出现的问题可能出现的问题:生产者比消费者快时生产者比消费者快时,消费者会漏掉一些数据消费者会漏掉一些数据没有取到没有取到消费者比生产者快时消费者比生产者快时,消费者取相同的数据消费者取相同的数据.notify()和和wait ()方法用来协调读取的关系方法用来协调读取的关系.notify()和和wait ()都只能从同步方法中调用都只能从同步方法中调用.7.3 线程同步nnotify的作用是唤醒正在等待同一个监视器的线
21、程.nwait的作用是让当前线程等待n信息版例子nread()方法在读信息之前先等待,直到信息可读,读完后通知要写的线程.nwrite()方法在写信息之前先等待,直到信息被取走,写完后通知要读的进程.7.3 线程同步writerreaderaaaabbbbbccccaaaaaaaaaaaaaaaaaaaaaaaabbbbbcccc ccccccccccccbbbbbcccc7.3 线程同步nclass WaitNotifyDemo n public static void main(String args) n MessageBoard m = new MessageBoard();n Rea
22、der readfrom_m = new Reader(m);n Writer writeto_m=new Writer(m);n readfrom_m.start(); n writeto_m.start();n n7.3 线程同步class MessageBoard private String message; private boolean ready = false;(信号灯信号灯) public synchronized String read() while (ready = false) try wait(); catch (InterruptedException e) re
23、ady = false; notify(); /起始状态先写后读起始状态先写后读return message; public synchronized void write(String s) while (ready = true) try wait(); catch (InterruptedException e) message = s; ready = true; notify(); 7.3 线程同步class Writer extends Thread private MessageBoard mBoard; private String messages = Monday :-,“
24、.”,Sunday : -; public Writer(MessageBoard m) mBoard = m; public void run() for (int i = 0; i messages.length; i+) mBoard.write(messages i ); System.out.println(Writer wrote: + messagesi ); try sleep(int)(Math.random() * 100); catch (InterruptedException e) mBoard.write(logoff); 7.3 线程同步class Reader extends Thread private MessageBoard mBoard; public Reader(MessageBoard m) mBoard = m; public void run() Stri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省泉州市泉港区2025-2026学年上学期期末八年级数学试卷(含答案)
- 飞腾培训课件
- 钢结构环保施工技术要点
- 2026河北雄安人才服务有限公司商业招商岗招聘1人考试备考试题及答案解析
- 2026广东广州市黄埔区大沙街道招聘编外聘用人员1人参考考试题库及答案解析
- 2026山东事业单位统考烟台莱州市招聘63人备考考试试题及答案解析
- 2026年甘肃白银市平川区容通水务有限公司招聘参考考试题库及答案解析
- 2026年上半年黑龙江省农业农村厅事业单位公开招聘工作人员19人考试备考试题及答案解析
- 法律事务办管理制度(3篇)
- 工资薪酬管理制度是什么(3篇)
- 预中标协议书电子版
- 龟的解剖课件
- 蒙牛乳业股份有限公司盈利能力分析
- 2025年碳排放管理师考试试题及答案
- 八年级英语教学设计案例分析Unit3
- 2025年高尔基《童年》阅读测试+答案
- 95-1轻机枪射击课件
- 跟单转正述职报告
- GB/T 46425-2025煤矸石山生态修复技术规范
- 2024-2025学年度黄河水利职业技术学院单招《职业适应性测试》考前冲刺试卷附答案详解【综合卷】
- 中资企业在泰国发展报告(2024-2025)-境外商会联席会议-202509
评论
0/150
提交评论