北大计算机系java培训讲义7线程_第1页
北大计算机系java培训讲义7线程_第2页
北大计算机系java培训讲义7线程_第3页
北大计算机系java培训讲义7线程_第4页
北大计算机系java培训讲义7线程_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论