大学教程从零开始多线程课件

上传人:58****5 文档编号:243154554 上传时间:2024-09-17 格式:PPT 页数:27 大小:245.50KB
返回 下载 相关 举报
大学教程从零开始多线程课件_第1页
第1页 / 共27页
大学教程从零开始多线程课件_第2页
第2页 / 共27页
大学教程从零开始多线程课件_第3页
第3页 / 共27页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,8.1,线程的基本概念,什么是线程?,线程就是程序中单独顺序的流控制。线程本身不能运行,它只能用于程序中。,线程,(thread),就是进程中的一个执行线索。,Java,虚拟机允许进程中同时执行多个线程。每个线程都有一个优先级。具有较高优先级的线程先执行。,线程是操作系统分配,CPU,时间的基本实体。每一个应用程序至少有一个线程,也可以拥有多个线程。线程是程序中的代码流。多个线程可以同时运行并能共享资源。,线程与进程不同,每个进程都需要操作系统为其分配独立的地址空间,而同一进程中的各个线程是在同一块地址空间中工作。,在,Java,程序中,一些动态效果,(,如动画的实现、动态的字幕等,),常利用多线程技术来实现。,什么是多线程?,多线程则指的是在单个程序中可以同时运行多个不同的线程执行不同的任务,.,8.1.1,线程的生命周期,线程的生命周期:,一个线程从创建到死亡的过程。,线程的生命周期可分为五个状态:,创建状态,就绪状态,运行状态,阻塞状态,死亡状态,5,线程的生命周期,线程的状态转换图:,6,线程的生命周期,创建状态,当用,new,操作符创建一个新的线程对象时,该线程处于创建状态。,处于创建状态的线程只是一个空的线程对象,系统不为它分配资源,此时只能调用,start,方法启动该线程,调用其它任何方法都会产生线程非法状态异常。,7,线程的生命周期,2.,就绪状态,执行线程的,start(),方法将为线程分配必须的系统资源,安排其运行,并调用线程体,run(),方法,这样就使得该线程处于可运行,( Runnable ),状态。,这一状态并不是运行中状态(,Running ),,因为线程也许实际上并未真正运行。,8,线程的生命周期,3.,运行状态,是某个就绪状态的线程获得,CPU,资源,正在运行,如果有更高优先级的线程进入就绪状态,则该线程就被迫放弃对,CPU,的控制进入就绪状态,可使用,yield (),方法主动放弃,CPU,也可能由于执行结束或执行,stop(),方法进入死亡状态,.,9,线程的生命周期,4.,阻塞状态,当发生下列事件时,处于运行状态的线程会转入到阻塞状态。,调用了,sleep,()方法;,线程调用,wait,方法所等待的特定条件的满足,线程输入,/,输出阻塞,10,线程的生命周期,从阻塞状态恢复到就绪状态三种途径:,处于睡眠状态的线程在指定的时间过去后,如果线程在等待某一条件,另一个对象必须通过,notify(),或,notifyAll(),方法通知等待进程条件的改变,如果线程是因为输入,/,输出阻塞,输入,/,输出完成,11,8.1.2,线程的优先级,1.,线程的优先级及其设置,设置优先级是为了在多线程环境中便于系统对线程的调度,优先级高的线程将优先执行,一个线程的优先级设置遵从以下原则:,线程创建时,子进程继承父进程的优先级,线程创建后,可通过调用,setPriority(),方法改变优先级。,线程的优先级是,1-10,之间的正整数。,1 - MIN_PRIORITY,10,MAX_PRIORITY,5- NORM_PRIORITY,12,线程的优先级,线程的调度策略,线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行,线程体中调用了,yield(),方法,让出了对,CPU,的占用权,线程体中调用了,sleep(),方法,使线程进入睡眠状态,线程由于,I/O,操作而受阻塞,另一个更高优先级的线程出现。,在支持时间片的系统中,该线程的时间片用完。,13,线程的生命周期,5.,死亡状态,当线程的,run,方法执行结束后,该线程自然,死亡。,14,8.2,线程的实现,在,Java,中通过,run,方法为线程指明要完成的任务,有两种技术来为线程提供,run,方法。,继承,Thread,类并重载,run,方法。,通过定义实现,Runnable,接口的类进而实现,run,方法。,15,线程的实现,继承,Thread,类并重载,run,方法。,Thread,类:是专门用来创建线程和对线程进行操作的类。,Thread,中定义了许多方法对线程进行操作。,Thread,类在缺省情况下,run,方法是空的。可以通过继承,Thread,类并重写,Thread,类的,run,方法实现用户线程。,16,线程的实现,继承,Thread,类并重载,run,方法。,总体结构如下:,public class MyThread extends Thread ,public void run() , ,MyThread t = new MyThread();,t. start();,17,线程的实现,执行,Runnable,接口的类实现,run,方法。,通过建立一个实现了,Runnable,接口的对象,并以它作为线程的目标对象来创建一个线程。,Runnable,接口:定义了一个抽象方法,run(),。定义如下:,public interface java.lang.Runnable,public abstract void run();,18,线程的实现,执行,Runnable,接口的类实现,run,方法。,创建的总体框架如下:,class MyRunner implements Runnable ,public void run() ,MyRunner r = new MyRunner();,Thread t = new Thread( r);,19,线程的实现,总结:,两种方法均需执行线程的,start,方法为线程分配必须的系统资源、调度线程运行并执行线程的,run,方法。,在具体应用中,采用哪种方法来构造线程体要视情况而定。通常,当一个线程已继承了另一个类时,就应该用第二种方法来构造,即实现,Runnable,接口。,线程的消亡不能通过调用一个,stop(),命令。而是让,run(),方法自然结束。,20,8.3,多线程的互斥,为什么要引入互斥机制,在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源。必须对这种潜在资源冲突进行预防。,解决方法:在线程使用一个资源时为其加锁即可。访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁。,21,多线程的互斥,2.,怎样实现互斥,对于访问某个关键共享资源的所有方法,都必须把它们设为,synchronized,例如:,synchronized void f() /* . */ synchronized void g() /* . */ ,如果想保护某些资源不被多个线程同时访问,可以强制通过,synchronized,方法访问那些资源。调用,synchronized,方法时,对象就会被锁定。,22,多线程的互斥,public class MyStack ,int idx = 0;,char data = new char 6;,public synchronized void push( char c) ,data idx = c;,idx+;,public synchronized char pop() ,idx-;,return data idx;,23,多线程的互斥,说明:,当,synchronized,方法执行完或发生异常时,会自动释放锁。,被,synchronized,保护的数据应该是私有(,private,)的。,24,多线程的同步,怎样实现同步,线程间的相互作用:,wait and notify,25,多线程的同步,wait,() 和,notify,() 方法:两个方法配套使用,,wait,()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的,notify,()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的,notify,() 被调用。,26,多线程的同步,怎样实现同步,具有,wait(),和,notify(),的线程状态图:,27,多线程的同步,除了,notify,(),还有一个方法,notifyAll,() 也可起到类似作用,唯一的区别在于,调用,notifyAll,()方法将把因调用该对象的,wait,()方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!