《北京大学JAVA讲义__第七章_多线程》由会员分享,可在线阅读,更多相关《北京大学JAVA讲义__第七章_多线程(46页珍藏版)》请在金锄头文库上搜索。
1、第7章 多线程,北京大学计算机系代亚非,2,第7章 多线程,7.1 多线程基本概念7.2 创建线程的方式7.3 线程的挂起与唤醒7.4 多线程问题7.5 小结,3,7.1 多线程基本概念,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,4,7.1 多线程基本概念,多线程的优势:减轻编写交互频繁、涉及面多的程序的困难.程序的吞吐量会得到改善.由多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行),5,7.1 多线程基本概念,线程与进程的区别:多个进程的内
2、部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,6,7.1 多线程基本概念,对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术.虽然Macintosh,Windows NT,Windows 9等操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.,7,7.2 创建线程的方式,1. public class mythread extends Applet implement
3、s Runnable (小应用或已经是某个类的子类时)2. 继承类Thread public class mythread extends Thread3. 上述两种方法中都可用类Thread产生线程的对象 Thread newthread;4. 创建并启动线程 newthread=new Thread(this); newthread.start();,8,7.2 创建线程的方式,5. run方法是运行线程的主体,启动线程时,由java直接调用 public void run() 6.停止线程,由小应用程序的stop调用线程的stop newthread.stop() 7 sleep方法的作
4、用,暂停线程的执行,让其它线程得到机会,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() for (int i=0;i4
5、;i+) System.out.println( “”+i); trysleep(400); catch(InteruptedException e) ,7.2 创建线程的方式,10,7.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)
6、 a=b; public void run() while(true) a.repaint();trysleep(400); catch(InterruptedException e) ,11,7.2 创建线程的方式,8.其它常用的方法 isAlive :判断线程目前是否正在执行状态中 if(newthread.isAlive() newthread.stop(); resume:要求被暂停得线程继续执行 suspend:暂停线程的执行 join:等待线程执行完毕 thatThread.join();被等待的那个线程不结束,当前线程就一直等待. yield:将执行的权力交给其它线程,自己到队列
7、的最后等待.,12,7.2 创建线程的方式,9.线程的优先权某一时刻只有一个线程在执行,调度策略为固定优先级调度.newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITY NOM_PRIORITY MAX-PRIORITY10. 自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.,13,7.2 创建线程的方式,11. 线程的状态,14,7.2 创建线程的方式,当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。如果希望线程正常终止,可采用标记来使线程中的run()方法退出。,15,7.2
8、 创建线程的方式,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,7.2 创建线程的方式,public class ControlThread private Runnable r=new Xyz(); private Thread t=new Thread(r); publ
9、ic void startThread() t.start(); publi void stopThread() r.stopRunning();,17,7.3 线程的挂起与唤醒,暂停线程的执行等待条件满足再执行.下面的例子显示线程的挂起和唤醒小应用程序第一次开始时,线程被启动浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起.浏览器回到原来的页面时,线程被唤醒.,18,7.3 线程的挂起与唤醒,public void start() if (mythread=null) mythread=new Thread(); mythread.start(); else mythread
10、.resume();public void run() while(true) trysleep(100); catch(InterruptedException e) public void stop()mythread.suspend();.,19,7.4 多线程问题-执行的顺序,多个线程运行时,调度策略为固定优先级调度.级别相同时,由操作系统按时间片来分配下面给出的例子中,共运行三个线程,它们做同样的事, 每次打印循环次数和自己的序列号,运行结果表明,它们并不是连续运行的.在上例中如果给某个线程赋予较高的优先权,则发现这个进程垄断控制权 thread.setPriority(Thread
11、.MAX_PRIORITY)threadmultithread.class-f1.batthreadPriority.class-f2.bat,20,7.3 多线程问题,/多个进程运行时执行顺序是交叉的class multithread extends Thread int threadNum; public static void main(String args) multithread array=new multithread3; for (int i=0;i3;i+) arrayi=new multithread(i); for (int i=0;i3;i+) arrayi.star
12、t(); 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.);,21,7.4 多线程问题-如何写多线程,1.分别定义不同的线程类,在各自的run方法中定义线程的工作 class mythread1 extends Thread public void run. class mythread2 extend
13、s 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(); ,22,7.4 多线程问题-如何写多线程,练习:将窗口分为上下两个区,分别运行两个线程,一个在上面的区域中显示由右向左游动的字符串,另一个在下面的区域从左向右游动的字符串.方法一: 一个线程,在paint方法中使用两个输出字符串的语句p
14、ublic 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,7.4 多线程问题-如何写多线程,方法二:定义两个类,运行各自的线程,各自有自己的paint()方法.注意: 两个小应用程序必须是panel类或者是canvas类,将小应用的区域分成两块,否则不能运行paint语句.,24,7.4 多线程问题-线程间的通信,1. 线程间的通信可以用管道流,.创建管道流:PipedInputStream pis=new PipedInputStream();PipedOutputStream pos=new PipedOutputStream(pis);或:PipedOutputStream pos=new PipedOutputStream();PipedInputStream pis=new PipedInputStream(pos);,