版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 多线程北京大学计算机系代亚非2第7章 多线程7.1 多线程基本概念7.2 创建线程的方式7.3 线程的挂起与唤醒7.4 多线程问题7.5 小结37.1 多线程基本概念文件输入输出装置各种系统资源数据区段程序区段只有一个地方在执行文件输入输出装置各种系统资源数据区段程序区段同时有数个地方在执行传统的进程多线程的任务47.1 多线程基本概念多线程的优势:减轻编写交互频繁、涉及面多的程序的困难.程序的吞吐量会得到改善.由多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行)57.1 多线程基本概念线程与进程的区别:多个进程的内部数据和状态都是完全独立的,而多线程是共享
2、一块内存空间和一组系统资源,有可能互相影响.线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。67.1 多线程基本概念对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术.虽然Macintosh,Windows NT,Windows 9等操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.77.2 创建线程的方式1. public class mythread extends Applet implements Runnable (小应用或已经是某个类的子类时)
3、2. 继承类Thread public class mythread extends Thread3. 上述两种方法中都可用类Thread产生线程的对象 Thread newthread;4. 创建并启动线程 newthread=new Thread(this); newthread.start();87.2 创建线程的方式5. run方法是运行线程的主体,启动线程时,由java直接调用 public void run() 6.停止线程,由小应用程序的stop调用线程的stop newthread.stop() 7 sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要丢出异常
4、,必须抓住.Trysleep(100)catch(InterruptedException e) 例:小应用程序中不用Runnable接口仍然可以使用线程(不调用主类的方法和调用主类的方法) 9import 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);
5、 trysleep(400); catch(InteruptedException e) 7.2 创建线程的方式107.2 创建线程的方式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 Threadmainclass a;C(mainclass b) a=b; public void run() while(true)
6、 a.repaint();trysleep(400); catch(InterruptedException e) 117.2 创建线程的方式8.其它常用的方法 isAlive :判断线程目前是否正在执行状态中 if(newthread.isAlive() newthread.stop(); resume:要求被暂停得线程继续执行 suspend:暂停线程的执行 join:等待线程执行完毕 thatThread.join();被等待的那个线程不结束,当前线程就一直等待. yield:将执行的权力交给其它线程,自己到队列的最后等待.127.2 创建线程的方式9.线程的优先权某一时刻只有一个线程在
7、执行,调度策略为固定优先级调度.newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITY NOM_PRIORITY MAX-PRIORITY10. 自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.137.2 创建线程的方式new Thread()New ThreadRunnablestart()Not Runnablestop()stop()Deadyield()stop() orrun()exit.suspend()sleep()wait()resume().11. 线程的状态147.2 创建线程的方式当一个线程执行
8、完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。如果希望线程正常终止,可采用标记来使线程中的run()方法退出。157.2 创建线程的方式public class Xyz implements Runnable private boolean timeToQuit=false; public void run() while (!timeToQuit) . /clean up before run() ends; public void stopRunning() timeToQuit=true; 167.2 创建线程的方式public class ControlThr
9、ead private Runnable r=new Xyz(); private Thread t=new Thread(r); public void startThread() t.start(); publi void stopThread() r.stopRunning();177.3 线程的挂起与唤醒暂停线程的执行等待条件满足再执行.下面的例子显示线程的挂起和唤醒小应用程序第一次开始时,线程被启动浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起.浏览器回到原来的页面时,线程被唤醒.187.3 线程的挂起与唤醒public void start() if (mythr
10、ead=null) mythread=new Thread(); mythread.start(); else mythread.resume();public void run() while(true) trysleep(100); catch(InterruptedException e) public void stop()mythread.suspend();.197.4 多线程问题-执行的顺序多个线程运行时,调度策略为固定优先级调度.级别相同时,由操作系统按时间片来分配下面给出的例子中,共运行三个线程,它们做同样的事, 每次打印循环次数和自己的序列号,运行结果表明,它们并不是连续运
11、行的.在上例中如果给某个线程赋予较高的优先权,则发现这个进程垄断控制权 thread.setPriority(Thread.MAX_PRIORITY)threadmultithread.class-f1.batthreadPriority.class-f2.bat207.3 多线程问题/多个进程运行时执行顺序是交叉的class multithread extends Thread int threadNum; public static void main(String args) multithread array=new multithread3; for (int i=0;i3;i+)
12、arrayi=new multithread(i); for (int i=0;i3;i+) arrayi.start(); multithread(int SerialNum) super(); threadNum=SerialNum; public void run() for(int j=0;j5;j+)System.out.println(“ +MySerialNum); System.out.println(thread +threadNum+ bye.);217.4 多线程问题-如何写多线程1.分别定义不同的线程类,在各自的run方法中定义线程的工作 class mythread1
13、 extends Thread public void run. class mythread2 extends Thread public void run. 2. 在主类中实例化各线程类,并启动线程. public class demo extends Applet public void init() mythread t1=new mythread1(); mythread t2=new mythread2(); t1.start(); t2.start(); 227.4 多线程问题-如何写多线程练习:将窗口分为上下两个区,分别运行两个线程,一个在上面的区域中显示由右向左游动的字符串,
14、另一个在下面的区域从左向右游动的字符串.方法一: 一个线程,在paint方法中使用两个输出字符串的语句public void paint(Graphics g) if y1200 y2=0 else y2=y2+10; g.drawString(“hello, Java!”,20,y1,); g.drawString(“hello, Java!”,40,y2,);237.4 多线程问题-如何写多线程方法二:定义两个类,运行各自的线程,各自有自己的paint()方法.注意: 两个小应用程序必须是panel类或者是canvas类,将小应用的区域分成两块,否则不能运行paint语句.247.4 多线
15、程问题-线程间的通信1. 线程间的通信可以用管道流,.创建管道流:PipedInputStream pis=new PipedInputStream();PipedOutputStream pos=new PipedOutputStream(pis);或:PipedOutputStream pos=new PipedOutputStream();PipedInputStream pis=new PipedInputStream(pos);线程1PipedOutputStreamPipedInputStream输出流outStream输入流inStream线程2257.4 多线程问题-线程间的通
16、信管道流不能直 接读写PrintStream p = new PrintStream( pos );p.println(“hello”);DataInputStream d=new DataInputStream(pis);d.readLine();2. 通过一个中间类来传递信息.线程2线程1中间类mssm.write(s)s=m.read()write()read()printStream DataInputStream267.4 多线程问题-线程间的通信管道流可以连接两个线程间的通信下面的例子里有两个线程在运行,一个往外输出信息,一个读入信息.将一个写线程的输出通过管道流定义为读线程的输入
17、.outStream = new PipedOutputStream();inStream = new PipedInputStream(outStream);new Writer( outStream ).start();new Reader( inStream ).start(); 27(threadPipethread.class-f3.bat)7.4 多线程问题-线程间的通信主类Pipethread辅类Writer线程类辅类Reader线程类管道流将数据写到输出流从流中读数据输入流作为参数传给WriterWriter( outStream )287.4 多线程问题-线程间的通信.pub
18、lic class Pipethread public static void main(String args) Pipethread thisPipe = new Pipethread(); thisPcess(); public void process() PipedInputStream inStream; PipedOutputStream outStream; PrintStream printOut; try outStream = new PipedOutputStream(); inStream = new PipedInputStream(outStream
19、); new Writer( outStream ).start(); new Reader( inStream ).start(); catch( IOException e ) 297.4 多线程问题-线程间的通信class Reader extends Thread private PipedInputStream inStream;/从中读数据 public Reader(PipedInputStream i) inStream = i; public void run() String line; DataInputStream d; boolean reading = true;
20、try d = new DataInputStream( inStream ); while( reading & d != null) tryline = d.readLine(); if( line != null ) System.out.println( ”Read: + line ); else reading = false; catch( IOException e) catch( IOException e ) System.exit(0); try Thread.sleep( 4000 ); catch( InterruptedException e )307.4 多线程问题
21、-线程间的通信.class Writer extends Thread private PipedOutputStream outStream;/将数据输出 private String messages = Monday, Tuesday , Wednsday,Thursday,Friday :, Saturday:,Sunday :; public Writer(PipedOutputStream o) outStream = o; public void run() PrintStream p = new PrintStream( outStream ); for (int i = 0;
22、 i messages.length; i+) p.println(messages i ); p.flush(); System.out.println(WrIte: + messagesi ); p.close(); p = null; 317.3 多线程问题-资源协调1. 数据的完整性线程1线程2线程10资源取过来加1后送回去withdrwal()withdrwal()透支余额变量327.3 多线程问题-资源协调对共享对象的访问必须同步,叫做条件变量.Java语言允许通过监视器(有的参考书称其为管程)使用条件变量实现线程同步.监视器阻止两个线程同时访问同一个条件变量.它的如同锁一样作用在
23、数据上.线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入.withdrawal()线程1监视器线程2337.3 多线程问题-资源协调用synchronized来标识的区域或方法即为监视器监视的部分。一个类或一个对象由一个监视器,如果一个程序内有两个方法使用synchronized标志,则他们在一个监视器管理之下.一般情况下,只在方法的层次上使用关键区readwrite监视器线程1线程2347.3 多线程问题-资源协调此处给出的例子演示两个线程在同步限制下工作的情况.class Account sta
24、tics int balance=1000; /为什么用static? statics int expense=0; public synchronized void withdrawl(int amount) if (amountf4.bat377.3 多线程问题-资源协调writerreaderaaaabbbbbccccaaaaaaaaaaaaaaaaaaaaaaaabbbbbccccccccccccccccbbbbbcccc387.3 多线程问题-资源协调class WaitNotifyDemo public static void main(String args) MessageBo
25、ard m = new MessageBoard(); Reader readfrom_m = new Reader(m); Writer writeto_m=new Writer(m); readfrom_m.start(); writeto_m.start(); 397.3 多线程问题-资源协调class MessageBoard private String message; private boolean ready = false;(信号灯) public synchronized String read() while (ready = false) try wait(); cat
26、ch (InterruptedException e) ready = false; notify(); /起始状态先写后读return message; public synchronized void write(String s) while (ready = true) try wait(); catch (InterruptedException e) message = s; ready = true; notify(); 407.3 多线程问题-资源协调class Reader extends Thread private MessageBoard mBoard; public
27、Reader(MessageBoard m) mBoard = m; public void run() String s = ;boolean reading = true;while( reading ) s = mBoard.read(); System.out.println(Reader read: + s); if( s.equals(logoff) ) reading = false; System.out.println(Finished: 10 seconds.);try sleep( 10000 ); catch (InterruptedException e) 417.3 多线程问题-资源协调class Writer extends Thread private MessageBoard mBoard; private String messages = Monday :-,“.”,Sunday :
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贷款延期补充协议书范本
- 2024居间合同样的合同
- 工程测量设计合同
- 培训机构合作合同样本
- 技术许可与知识产权保护
- 国有企业下岗职工出中心与失业保险“并轨”协议书
- 2024配方转让协议标准文本
- 工程合同签订方法
- 房屋租赁合同提前解除的策略与建议
- 园林绿化承包经营合同样本
- 2024年秋一年级上册13 an en in un ün 公开课一等奖创新教案(2课时)
- 光伏发电安装质量验收评定表
- Unit 1 You and Me教学设计2024-2025学年人教版(2024)英语七年级上册(安徽)
- 2024-2030年中国汽车铝合金(OE)行业市场发展趋势与前景展望战略分析报告
- 2024新教科版一年级科学上册第二单元《我们自己》全部教案
- 初中文言文及古诗
- 网上书店设计说明书-(含结构图、流程图和E-R图)
- 麟北煤矿数据中心技术方案
- 六年级上册英语试题- Module1 Family and friends单元测试 牛津上海版(含答案及解析)
- 选择性必修二《Unit 3 Food and Culture》单元教学设计
- 农产品市场营销智慧树知到期末考试答案章节答案2024年东北农业大学
评论
0/150
提交评论