B09多线程-1ppt课件(全).ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《B09多线程-1ppt课件(全).ppt》由会员分享,可在线阅读,更多相关《B09多线程-1ppt课件(全).ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9章章 多线程多线程9.1 多线程的概念9.2 线程类9.3 资源的协调与同步9.4 线程间通信9.1 多线程的概念多线程的概念程序是一段静态的代码,它是应用软件执行的蓝本。进程就是程序的运行时的一个实例。线程可以看作单独地占有CPU时间来执行相应的代码的。线程是共享地址空间的,也就是说多线程可以同时读取相同的地址空间,并且利用这个空间进行交换数据。9.1 多线程的概念多线程的概念多线程具有以下特点:(1 1)多个线程在运行时,系统自动在线程之间进行切换;)多个线程在运行时,系统自动在线程之间进行切换;(2 2)由于多个线程共存于同一块内存,线程之间的通信非常容易;)由于多个线程共存于同一
2、块内存,线程之间的通信非常容易;(3 3)JavaJava将线程视为一个对象。线程要么是将线程视为一个对象。线程要么是ThreadThread类的对象,要么是接类的对象,要么是接口口RunnableRunnable的对象。的对象。(4 4)当多个线程并行执行时,具有较高优先级的线程将获得较多的)当多个线程并行执行时,具有较高优先级的线程将获得较多的CPUCPU时间片;时间片;(5 5)优先级是从)优先级是从0 0到到1010的整数,并且它仅表示线程之间的相对关系;的整数,并且它仅表示线程之间的相对关系;(6 6)多个线程共享一组资源,有可能在运行时产生冲突。必须采用)多个线程共享一组资源,有可
3、能在运行时产生冲突。必须采用synchronizedsynchronized关键字协调资源,实现线程同步。关键字协调资源,实现线程同步。9.2 线程类线程类9.2.1 多线程编程中常用的常量和方法9.2.2 线程的生命周期9.2.3 创建多线程的方法9.2.1 多线程编程中常用的常量和方法多线程编程中常用的常量和方法Thread类包含的常量有:1.1.public static final int MAX_PRIORITYpublic static final int MAX_PRIORITY:最大最大优先级,值是优先级,值是1010。2.2.public static final int M
4、IN_PRIORITYpublic static final int MIN_PRIORITY:最小最小优先级,值是优先级,值是1 1。3.3.public static final int NORM_PRIORITYpublic static final int NORM_PRIORITY:缺省:缺省优先级,值是优先级,值是5 5。9.2.1 多线程编程中常用的常量和方法多线程编程中常用的常量和方法常用方法:currentThread()currentThread():返回当前运行的线程对象,是一个静态的方返回当前运行的线程对象,是一个静态的方法。法。sleep(int n)sleep(in
5、t n):使当前运行的线程睡使当前运行的线程睡n n个毫秒,然后继续执行,个毫秒,然后继续执行,也是静态方法。也是静态方法。yield()yield():使当前运行的线程放弃执行,切换到其它线程,是一:使当前运行的线程放弃执行,切换到其它线程,是一个静态方法。个静态方法。isAlive()isAlive():判断线程是否处于执行的状态,返回值判断线程是否处于执行的状态,返回值truetrue表表示处于运行状态,示处于运行状态,falsefalse表示已停止。表示已停止。start()start():使调用该方法的线程开始执行。:使调用该方法的线程开始执行。run()run():该方法由:该方法
6、由start()start()方法自动调用。方法自动调用。9.2.1 多线程编程中常用的常量和方法多线程编程中常用的常量和方法常用方法:stop()stop():使线程停止执行,并退出可执行状态。:使线程停止执行,并退出可执行状态。suspend()suspend():使线程暂停执行,不退出可执行态。使线程暂停执行,不退出可执行态。resume()resume():将暂停的线程继续执行。将暂停的线程继续执行。setName(String s)setName(String s):赋予线程一个名字。:赋予线程一个名字。getName()getName():获得调用线程的名字。:获得调用线程的名字。
7、getPriority()getPriority():获得调用线程的优先级。:获得调用线程的优先级。setPriority(int p)setPriority(int p):设置线程的优先级。:设置线程的优先级。join()join():等待线程死亡,若中断了该线程,:等待线程死亡,若中断了该线程,将抛出异常。将抛出异常。【实例8-1】1.1.class class getThreadInfogetThreadInfo 2.2.public static void public static void main(Stringmain(String argsargs)3.3.Thread Thr
8、ead currcurr;4.4.intint num=7;num=7;5.5.currcurr=Thread.currentThreadThread.currentThread();();6.6.curr.setPriority(numcurr.setPriority(num););7.7.(当前线程:当前线程:+currcurr););8.8.(线程名:线程名:+curr.getNamecurr.getName();();9.9.(优先级优先级 :+curr.getPrioritycurr.getPriority();();10.10.11.11.程序输出结果:当前线程:当前线程:Thre
9、admainThreadmain,7 7,mainmain线程名线程名 :mainmain优先级优先级 :7 79.2.2 线程的生命周期线程的生命周期Java支持一种“抢占式”(preemptive)调度方式“Newborn”(新建)状态:线程在己被创建但未执行这段时间内,处于一个特殊线程在己被创建但未执行这段时间内,处于一个特殊的的NewbornNewborn状态,这时,线程对象己被分配内存空间,状态,这时,线程对象己被分配内存空间,其私有数据己被初始化,但该线程还未被调度。此时其私有数据己被初始化,但该线程还未被调度。此时线程对象可通过线程对象可通过startstart()方法调度,或者
10、利用()方法调度,或者利用stopstop()()方法杀死方法杀死.新创建的线程一旦被调度,就将切换到新创建的线程一旦被调度,就将切换到RunnableRunnable状态。状态。9.2.2 线程的生命周期线程的生命周期Runnable(就绪)状态:表示线程正等待处理器资源,随时可被调用执行。处表示线程正等待处理器资源,随时可被调用执行。处于就绪状态的线程事实上己被调度,也就是说,它们于就绪状态的线程事实上己被调度,也就是说,它们己经被放到某一队列等待执行。处于就绪状态的线程己经被放到某一队列等待执行。处于就绪状态的线程何时可真正执行,取决于线程优先级以及队列的当前何时可真正执行,取决于线程优
11、先级以及队列的当前状况。线程的优先级如果相同,将遵循状况。线程的优先级如果相同,将遵循 先来先服务先来先服务 的调度原则。的调度原则。9.2.2 线程的生命周期线程的生命周期“Running”(运行)状态:表明线程正在运行,该线己经拥有了对处理器的控制表明线程正在运行,该线己经拥有了对处理器的控制权,其代码目前正在运行。这个线程将一直运行直到权,其代码目前正在运行。这个线程将一直运行直到运行完毕,除非运行过程的控制权被一优先级更高的运行完毕,除非运行过程的控制权被一优先级更高的线程强占。线程强占。9.2.2 线程的生命周期线程的生命周期“Blocked”(堵塞)状态:一个线程如果处于一个线程如
12、果处于BlockedBlocked(堵塞)状态,那么暂时这个线程将(堵塞)状态,那么暂时这个线程将无法进入就绪队列。处于堵塞状态的线程通常必须由某些事件才无法进入就绪队列。处于堵塞状态的线程通常必须由某些事件才能唤醒。至于是何种事件,则取决于堵塞发生的原因:处于睡眠能唤醒。至于是何种事件,则取决于堵塞发生的原因:处于睡眠中的线程必须被堵塞一段固定的时间中的线程必须被堵塞一段固定的时间;被挂起、或处于消息等待状被挂起、或处于消息等待状态的线程则必须由一外来事件唤醒。态的线程则必须由一外来事件唤醒。“Dead”(死亡)状态:DeadDead表示线程巳退出运行状态,并且不再进入就绪队列。其中原表示线
13、程巳退出运行状态,并且不再进入就绪队列。其中原因可能是线程巳执行完毕(正常结束),也可能是该线程被另一因可能是线程巳执行完毕(正常结束),也可能是该线程被另一线程所强行中断(线程所强行中断(killkill)。)。图8-1 线程生命周期示意图start创建就绪运行挂起睡眠阻塞结束等待时间片结束分配时间片睡眠时间结束notifynotify AllsleepwaitstopI/O请求suspendresumeI/O请求结束9.2.3 创建多线程的方法创建多线程的方法Java中编程实现多线程应有两种途径一种是创建一种是创建ThreadThread线程的子类线程的子类实现一个接口实现一个接口Runn
14、ableRunnable无论是哪种途径最终都需要使用无论是哪种途径最终都需要使用ThreadThread类及其方法。类及其方法。9.2.3 创建多线程的方法创建多线程的方法1通过继承Thread类实现多线程(1 1)定义定义ThreadThread类的一个子类。类的一个子类。(2 2)定义子类中的方法定义子类中的方法run()run(),覆盖父类中的方法,覆盖父类中的方法runrun()()。(3 3)创建该子类的一个线程对象。)创建该子类的一个线程对象。(4 4)通过通过start()start()方法启动线程。方法启动线程。【实例8-2】1.1.class class myThreadmy
15、Thread extends Thread extends Thread2.2.intint sleeptimesleeptime;3.3.public public myThread(StringmyThread(String id)/id)/构造函数构造函数4.4.super(idsuper(id););5.5.sleeptimesleeptime=(=(int)(Math.randomint)(Math.random()*100);()*100);6.6.System.out.println(TheSystem.out.println(The Thread Name=+Thread Na
16、me=+getNamegetName()+()+7.7.,SleepingSleeping:+sleeptimesleeptime););8.8.9.9.public void run()public void run()10.10.try /try /通过线程睡眠模拟程序的执行通过线程睡眠模拟程序的执行 11.11.Thread.sleep(sleeptimeThread.sleep(sleeptime););12.12.13.13.catch(InterruptedExceptioncatch(InterruptedException e)e)14.14.System.err.printl
17、n(ExceptionSystem.err.println(Exception:+e.toStringe.toString();();15.15.16.16.System.out.println(TheSystem.out.println(The running Thread=+running Thread=+getNamegetName();();17.17.18.18.【实例8-2】19.19.public class public class fourThreadsfourThreads 20.20.public static void public static void main(S
18、tringmain(String argsargs)21.21.myThreadmyThreadt1t1,t2t2,t3t3,t4;t4;22.22.t1=new t1=new myThread(ThreadmyThread(Thread 1);1);23.23.t2=new t2=new myThread(ThreadmyThread(Thread 2);2);24.24.t3=new t3=new myThread(ThreadmyThread(Thread 3);3);25.25.t4=new t4=new myThread(ThreadmyThread(Thread 4);4);26.
19、26.t1.start();t1.start();t2.start();t2.start();27.27.t3.start();t3.start();t4.start();t4.start();28.28.29.29.【实例8-2】程序某次的运行结果:程序某次的运行结果:he Thread Name=Thread 1he Thread Name=Thread 1,SleepingSleeping:6 6The Thread Name=Thread 2The Thread Name=Thread 2,SleepingSleeping:4949The Thread Name=Thread 3The
20、 Thread Name=Thread 3,SleepingSleeping:1919The Thread Name=Thread 4The Thread Name=Thread 4,SleepingSleeping:6969The running Thread=Thread 1The running Thread=Thread 1The running Thread=Thread 3The running Thread=Thread 3The running Thread=Thread 2The running Thread=Thread 2The running Thread=Thread
21、 4The running Thread=Thread 4注意:注意:ThreadThread类中的类中的run()run()方法具有方法具有publicpublic属性,覆属性,覆盖该方法时,前面必须带上盖该方法时,前面必须带上publicpublic。9.2.3 创建多线程的方法创建多线程的方法2通过实现Runnable接口实现多线程(1 1)定义一个实现)定义一个实现RunnableRunnable接口的类。接口的类。(2 2)定义方法)定义方法run()run()。RunnableRunnable接口中有一个空的方接口中有一个空的方法法run()run(),实现它的类必须覆盖此方法。,
22、实现它的类必须覆盖此方法。(3 3)创建该类的一个线程对象,并将该对象作参数,)创建该类的一个线程对象,并将该对象作参数,传递给传递给ThreadThread类的构造函数,从而生成类的构造函数,从而生成ThreadThread类的一类的一个对象。个对象。(4 4)通过)通过start()start()方法启动线程。方法启动线程。【实例8-3】1.1.class class myThreadmyThread implements implements RunnableRunnable 2.2.intint count=1 count=1,number;number;3.3.public publ
23、ic myThread(intmyThread(int num)num)4.4.number=num;number=num;5.5.(创建线程:创建线程:+number);+number);6.6.7.7.public void run()public void run()8.8.while(truewhile(true)9.9.(线程线程 +number+number+:计数:计数 +count);+count);10.10.if(+countif(+count=6)return;=6)return;11.11.12.12.13.13.14.14.public class public cl
24、ass runnableThreadsrunnableThreads 15.15.public static void public static void main(Stringmain(String argsargs)16.16.for(intfor(int i=0;i5;i+)new i=0;i5;i+)new Thread(newThread(new myThread(i+1).start();myThread(i+1).start();17.17.18.18.【实例8-3】程序运行某次的输出结果:创建线程:创建线程:1 1创建线程:创建线程:2 2线程线程 1 1:计数:计数 1 1
25、线程线程 1 1:计数:计数 2 2线程线程 1 1:计数:计数 3 3线程线程 2 2:计数:计数 1 1线程线程 2 2:计数:计数 2 2线程线程 2 2:计数:计数 3 3创建线程:创建线程:3 3线程线程 3 3:计数:计数 1 1线程线程 3 3:计数:计数 2 2线程线程 3 3:计数:计数 3 3值得指出的是同一个实现了值得指出的是同一个实现了RunnableRunnable接口的对象作为参数产生的所有接口的对象作为参数产生的所有ThreadThread对象是同一对象下的线程。对象是同一对象下的线程。9.2.3 创建多线程的方法创建多线程的方法3两种方法的简单比较使用使用Thr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- B09 多线程 ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内