第11章 多线程.ppt
《第11章 多线程.ppt》由会员分享,可在线阅读,更多相关《第11章 多线程.ppt(46页珍藏版)》请在麦多课文档分享上搜索。
1、第11章 多线程,2,第11章 多线程,11.1 多线程基本概念 11.2 创建线程的方式 11.3 线程的挂起与唤醒 11.4 多线程问题 11.5 小结,3,11.1 多线程基本概念,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,4,11.1 多线程基本概念,多线程的优势: 减轻编写交互频繁、涉及面多的程序的困难. 程序的吞吐量会得到改善. 由多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行),5,11.1 多线程基本概念,线程与进程的区别:
2、多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响. 线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,6,11.1 多线程基本概念,对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术. 虽然Macintosh,Windows NT,Windows 9等操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.,7,11.2 创建线程的方式,1. public class mythread extends Applet
3、 implements Runnable(小应用或已经是某个类的子类时) 2. 继承类Threadpublic class mythread extends Thread 3. 上述两种方法中都可用类Thread产生线程的对象 Thread newthread; 4. 创建并启动线程newthread=new Thread(this);newthread.start();,8,11.2 创建线程的方式,5. run方法是运行线程的主体,启动线程时,由java直接调用 public void run() 6.停止线程,由小应用程序的stop调用线程的stop newthread.stop() 1
4、1 sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须抓住. Trysleep(100)catch(InterruptedException e) 例:小应用程序中不用Runnable接口仍然可以使用线程(不调用主类的方法和调用主类的方法),9,import java.applet.*; public class thread extends Applet mythread t1=new mythread();public init() t1.start(); class mythread extends Thread public void run() fo
5、r (int i=0;i4;i+) System.out.println( “”+i); trysleep(400); catch(InteruptedException e) ,11.2 创建线程的方式,10,11.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 Thread mainclass
6、 a;C(mainclass b) a=b; public void run() while(true) a.repaint();trysleep(400); catch(InterruptedException e) ,11,11.2 创建线程的方式,8.其它常用的方法isAlive :判断线程目前是否正在执行状态中if(newthread.isAlive() newthread.stop();resume:要求被暂停得线程继续执行suspend:暂停线程的执行join:等待线程执行完毕thatThread.join();被等待的那个线程不结束,当前线程就一直等待.yield:将执行的权力交
7、给其它线程,自己到队列的最后等待.,12,11.2 创建线程的方式,9.线程的优先权 某一时刻只有一个线程在执行,调度策略为固定优先级调度. newthread.setPriority(Thread.MIN_PRIORITY) 级别有:MIN-PRIORITYNOM_PRIORITYMAX-PRIORITY 10. 自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.,13,11.2 创建线程的方式,11. 线程的状态,14,11.2 创建线程的方式,当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。 如果希望线程正常终止,可采用标记来使线程中的
8、run()方法退出。,15,11.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; ,16,11.2 创建线程的方式,public class ControlThread private Runnable r=new Xyz();private Thread t=new T
9、hread(r);public void startThread() t.start(); publi void stopThread() r.stopRunning(); ,17,11.3 线程的挂起与唤醒,暂停线程的执行等待条件满足再执行. 下面的例子显示线程的挂起和唤醒 小应用程序第一次开始时,线程被启动 浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起. 浏览器回到原来的页面时,线程被唤醒.,18,11.3 线程的挂起与唤醒,public void start() if (mythread=null)mythread=new Thread(); mythread.sta
10、rt();else mythread.resume(); public void run() while(true) trysleep(100);catch(InterruptedException e) public void stop() mythread.suspend(); .,19,11.4 多线程问题-执行的顺序,多个线程运行时,调度策略为固定优先级调度.级别相同时,由操作系统按时间片来分配 下面给出的例子中,共运行三个线程,它们做同样的事, 每次打印循环次数和自己的序列号,运行结果表明,它们并不是连续运行的. 在上例中如果给某个线程赋予较高的优先权,则发现这个进程垄断控制权thr
11、ead.setPriority(Thread.MAX_PRIORITY) threadmultithread.class-f1.bat threadPriority.class-f2.bat,20,11.3 多线程问题,/多个进程运行时执行顺序是交叉的 class multithread extends Thread int threadNum;public static void main(String args) multithread array=new multithread3;for (int i=0;i +MySerialNum);System.out.println(“threa
12、d “+threadNum+ “bye.“);,21,11.4 多线程问题-如何写多线程,1.分别定义不同的线程类,在各自的run方法中定义线程的工作class mythread1 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();
13、t1.start(); t2.start(); ,22,11.4 多线程问题-如何写多线程,练习:将窗口分为上下两个区,分别运行两个线程,一个在上面的区域中显示由右向左游动的字符串,另一个在下面的区域从左向右游动的字符串. 方法一: 一个线程,在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,); ,23,11.4 多线程问题-如何写多线程,方法二
14、:定义两个类,运行各自的线程,各自有自己的paint()方法. 注意: 两个小应用程序必须是panel类或者是canvas类,将小应用的区域分成两块,否则不能运行paint语句.,24,11.4 多线程问题-线程间的通信,1. 线程间的通信可以用管道流,.创建管道流: PipedInputStream pis=new PipedInputStream(); PipedOutputStream pos=new PipedOutputStream(pis); 或: PipedOutputStream pos=new PipedOutputStream(); PipedInputStream pis
15、=new PipedInputStream(pos);,25,11.4 多线程问题-线程间的通信,管道流不能直 接读写PrintStream p = new PrintStream( pos ); p.println(“hello”); DataInputStream d=new DataInputStream(pis); d.readLine(); 2. 通过一个中间类来传递信息.,26,11.4 多线程问题-线程间的通信,管道流可以连接两个线程间的通信 下面的例子里有两个线程在运行,一个往外输出信息,一个读入信息. 将一个写线程的输出通过管道流定义为读线程的输入. outStream =
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 多线程 PPT
