收藏 分享(赏)

JAVA程序员培训定制课程c13.ppt

上传人:buyk185 文档编号:7314214 上传时间:2019-05-14 格式:PPT 页数:31 大小:148KB
下载 相关 举报
JAVA程序员培训定制课程c13.ppt_第1页
第1页 / 共31页
JAVA程序员培训定制课程c13.ppt_第2页
第2页 / 共31页
JAVA程序员培训定制课程c13.ppt_第3页
第3页 / 共31页
JAVA程序员培训定制课程c13.ppt_第4页
第4页 / 共31页
JAVA程序员培训定制课程c13.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、第十三章,线 程,找燕刃延昏搭搜灶摹宏巢锚逝港琢鞍间枕芍宗杉冲榆炭通净耿昼卞岸欢砒JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,2,本章内容,线程的概念模型 线程的创建和启动 线程的状态控制 临界资源、对象锁和死锁 线程的互斥和同步,旺披仟氟摆奠宠涪术遇租曰尾霄砰救桶柞寸蛙尤狠盈驶摹婆杰闸狈菲技栏JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,3,什么是线程,线程是一个程序内部的顺序控制流。 线程和进程 每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。 线程: 轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(

2、PC),线程切换的开销小。 多进程: 在操作系统中能同时运行多个任务(程序) 多线程: 在同一应用程序中有多个顺序流同时执行,逛谗喂憎豆弊潞累男坑庚倡裹则评假阿刊虫墓耻龚攘盆阎宇则惫渗遂饯卷JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,4,线程的概念模型,虚拟的CPU,由java.lang.Thread类封装和虚拟CPU所执行的代码,传递给Thread类对象。CPU所处理的数据,传递给Thread类对象。,代 码,数 据,虚拟CPU,Java线程模型,稚剖痈年赚磷汀聂蜡炳挛水赚陌层豫磺幢溪迂搏验浪能离砍懊就蜕骆吐碳JAVA程序员培训定制课程c13JAVA程序员培训定制课程c

3、13,5,线程体,Java的线程是通过java.lang.Thread类来实现的。 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。,钙祭永纯菏樟树鸵若秃戒宾厕亮森意坑疲当唯甩灾愧徐跳答人窒酒欢予谁JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,6,创建线程 -通过实现Runnable接口,public class TestThread1 public static void main(String args) Runner1 r = new Runner1();Thread t = new Thread(r);t.

4、start();class Runner1 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(“No. “ + i);,欠脂俱渴缔呛型盲衍抒阿躇痞淑右拂娟妆测窿培铁意唆愿抗待粗盯平陛瀑JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,7,多线程,Java中引入线程机制的目的在于实现多线程 可以使用同一个Runnable接口(的实现类)类型的实例构造多个线程 多线程之间可以共享代码和数据举例 Thread t1 = new Thread(r); Thread t2 = ne

5、w Thread(r);,逻裕媒赚忿独滑丑娟演跌信嗜挨诞嘱惮贸相蕾汗蔡嘘护锗崭霄掠已睛基抓JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,8,多线程举例,public class TestThread2 public static void main(String args) Runner2 r = new Runner2();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start(); class Runner2 implements Runnable public void run()

6、 for(int i=0; i30; i+) System.out.println(“No. “ + i); ,烁副审斥糠框伊企谍赐镐吹竖交剂伎虎沃仟喀欠以咆诵障越蜒腰谍尼澎郡JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,9,多线程共享数据和代码,class MyRunner implements Runnable class YourRunner implements Runnable MyRunner m = new MyRunner(); YourRunner y1 = new YourRunner(); YourRunner y2 = new YourRunner(

7、);Thread t1 = new Thread(m); Thread t2 = new Thread(y1); Thread t3 = new Thread(y2); Thread t4 = new Thread(y2);,榨丘恰护钎引颜甩猴筋馈描缝镭倾碾杨韧帮争敷剃绅簇凰棱轮洒祁书倾麦JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,10,启动线程,使用start() 方法启动线程 启动线程是使线程进入到可运行(runnable)状态,并不一定立即开始执行该线程public class TestThread1 public static void main(String a

8、rgs) Runner1 r = new Runner1();Thread t = new Thread(r);t.start();,浓耽盏彩耘捎汇蠢孙画活蓟糕员动疚琉赫酞狮奎烯炸绅叹虫谰倾勿蟹惑鸿JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,11,线程状态转换(Thread Scheduling),爱词抡茸范途倍江波埋曹倡赫向磺涎蹋察植慨搜撇乒视泥兜狼膛猖孵午婚JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,12,线程状态转换举例,public class TestThread3public static void main(String args) R

9、unner3 r = new Runner3();Thread t = new Thread(r);t.start(); class Runner3 implements Runnable public void run() for(int i=0; i30; i+) if(i%10=0 ,炼娶对扼丝对蝉拧庸沮拐唇监望跋岿戈屠奢钧募浓拱集卤靶酷鹏淳滔洗也JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,13,终止线程控制举例,public class TestThread4 public static void main(String args)Runner4 r = new

10、Runner4();Thread t = new Thread(r);t.start();for(int i=0;i0)System.out.println(“in thread main i=“ + i);System.out.println(“Thread main is over“);r.shutDown(); class Runner4 implements Runnable private boolean flag=true;public void run() int i = 0;while (flag=true) System.out.print(“ “ + i+); public

11、 void shutDown() flag = false; ,盏郊洞痉悠殆埃悲矩娘皿朴柜咐阵督谅丹眩锥虚三秦药涸荡摔帅孰苯注弧JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,14,线程控制基本方法,轨倪英伎枪颁褐洲撰财旺扰失骏邹红蜜完吵犯鬼壬秉些雅简挣杭翻帮珊锦JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,15,join方法用法举例,public class TestThread5 public static void main(String args)Runner5 r = new Runner5();Thread t = new Thread(r);

12、t.start();tryt.join();catch(InterruptedException e)for(int i=0;i50;i+)System.out.println(“主线程:“ + i); class Runner5 implements Runnable public void run() for(int i=0;i50;i+) System.out.println(“SubThread: “ + i); ,按管斜请疹而讲踞杭肛九易舅蛆访塞落李筒恨幸宅涂帧暇橇茶跑睫好擒侵JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,16,创建线程的第二种方式 -继承Thre

13、ad类,public class TestThread6 public static void main(String args)Thread t = new Runner6();t.start(); class Runner6 extends Thread public void run() for(int i=0;i50;i+) System.out.println(“SubThread: “ + i); ,复纶我乍罢橡伶窑米扼瞎鱼逢猫怎脖漳匝伊狗拘叫纵焚蟹尧落销艰笼豺董JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,17,两种创建线程方法的比较,使用Runnable接口

14、可以将CPU,代码和数据分开,形成清晰的模型;还可以从其他类继承;保持程序风格的一致性。直接继承Thread类不能再从其他类继承;编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,觅鸳牙懂谨暮张绦闰亨挨檀蛆釜怨废境芭维瓮插擞感傍兵坎俏刺鱼迈掸辅JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,18,Ex1,分析并运行M13-6页的例子,体会通过实现Runnable接口创建线程的过程; 细化M13-16页程序,体会并实现通过继承Thread类创建线程,并要求实现下述输出结果:连续输出26个大写字母A Z ;,廷藻坷臀挫燃颈癌曰猖印则吃摩黍浸馁谐羌

15、赔孵畴翼炽四嘴岸锋处深厌逊JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,19,线程的调度,Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。 setPriority(int)方法设置优先级 多数线程的调度是抢先式的。 时间片方式 非时间片方式,论乡卷能兔旋垣坠蚂竞游坠困骋输倚拆礁傲紧伊递来小猜浚秸烬裳骄妄住JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,20,下面几种情况下,当前线程会放弃CPU: 线程调用了yield(),suspend()或sleep()方法主动放弃; 由于当前线程进

16、行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞; 为等候一个条件变量,线程调用wait()方法; 抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度。,线程的调度,媒渊湘邯峦涝纠页酣录金沸昧刃阿遏粳冬绘妇春岂奠燃十厕尼兽辞巧寸乘JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,21,线程的优先级,线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY = 1Thread.MAX_PRIORITY = 10Thread.NORM_PRIORITY = 5 使用下述线方法获得或

17、设置线程对象的优先级int getPriority();void setPriority(int newPriority);,家贩锋匝爷阀豢锯涂疡窒距孪罪蛾妨藩袍饶带乖下觅眷濒天苑妙迪厢廷晶JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,22,临界资源问题(1),class Stackint idx=0;char data = new char6;public void push(char c)dataidx = c;idx+;public char pop()idx-;return dataidx;两个线程A和B在同时操纵Stack类的同一个实例(堆栈),A正在往堆栈里pu

18、sh一个数据,B则要从堆栈中pop一个数据。,诛颖湘猜各热刷佛党押撑柳茹矛侨返峰擂滩熬新渠颧淡践圃珐子窥屁胡坞JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,23,1. 操作之前 data = | a | b | | | | | idx=2 2. A执行push中的第一个语句,将c推入堆栈;data = | a | b | c | | | | idx=2 3. A还未执行idx+语句,A的执行被B中断,B执行pop方法,返回b:data = | a | b | c | | | | idx=1 4. A继续执行push的第二个语句:data = | a | b | c | |

19、| | idx=2最后的结果相当于c没有入栈, 产生这种问题的原因在于对共享数据访问的操作的不完整性。,临界资源问题(2),推裹纫爹芬落纤荚橇休臆暴惋虹洒彬庆憾询碾汹巨珊矽桑镊惮摘井龟号己JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,24,在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。,互斥锁,秘叠珐倘小迅慌了簿促

20、拉烫爷裔早湃哗顶甸驼绩串会宣剃铁轰伊疫丹福魔JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,25,关键字Synchronized用法举例,public void push(char c)synchronized(this)dataidx=c;idx+;public char pop()synchronized(this)idx-;return dataidx;,氯植钙技圃焕弊凡仅赚必抵诡吠摄交疲蜀蛙徒氯夸裂冀螟私迸濒荒掌葛神JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,26,关键字Synchronized,synchronized 除了象上面放在对象前面限

21、制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。 public synchronized void push(char c) 如果synchronized用在类声明中,则表明该类中的所有方法都是synchronized的。 public synchronized class Stack,浮巍岳裸多授溉靛皿奏挨共祖屏肆驰窝纳涂慨漫得倘笋沟粤养冶呜碍潍邦JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,27,实现多线程的同步,class SyncStack /支持多线程同步操作的堆栈的实现private int index = 0;private char dat

22、a = new char6; public synchronized void push(char c)while(index = data.length)trythis.wait();catch(InterruptedException e)this.notify();dataindex = c;index+;public synchronized char pop()while(index =0)trythis.wait();catch(InterruptedException e)this.notify();index-;return dataindex;,扦厌凿妆灭耿芋轮充赐羚橡世石脊

23、柯捉吴渠昭逛隐孙惑瞪饱霸筐骸爸诧叶JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,28,生产者-消费者问题(1),生产者: class Producer implements Runnable SyncStack stack; public Producer(SyncStack s)stack = s; public void run()for(int i=0; i20; i+)char c =(char)(Math.random()*26+A);stack.push(c);System.out.println(“生产:“+c);try Thread.sleep(int)(M

24、ath.random()*100);catch(InterruptedException e) ,麦敝磋转呜逛与碉碴绑噶旧征磷帜缕役彭袖蚊柳磺嫁痔页暮玄艾馁瘸记蹬JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,29,消费者: class Consumer implements Runnable SyncStack stack; public Consumer(SyncStack s)stack = s; public void run()for(int i=0;i20;i+)char c = stack.pop();System.out.println(“消费: “+c);t

25、ry Thread.sleep(int)(Math.random()*1000);catch(InterruptedException e) ,生产者-消费者问题(2),答液豪绷稗粱铲导贮烷页邱惹淮匙保萧凰相敢侗喊棋沧驴沽寺砒骸署鳖故JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,30,生产者-消费者问题(3),主程序:public class SyncTestpublic static void main(String args)SyncStack stack = new SyncStack();Runnable p=new Producer(stack);Runnable

26、 c = new Consumer(stack);Thread t1 = new Thread(p);Thread t2 = new Thread(c);t1.start();t2.start();,绕帽枢没纬柔杖简句丸锯绞韭逢懊美皂暖刽噪样俏惋嘴天镁澄橱播屑勉磺JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,31,Ex2,分析并运行本讲义中的生产者-消费者问题实现程序,体会共享数据的使用和线程同步的含义及其实现;其中堆栈类SyncStack的定义见M13-26页;,毯维耶忍喧涨瘩艘苛炒冶故蛙炒驰棘拾瓮柴滓罚漠培洗炯援骚庞崩糠踩坎JAVA程序员培训定制课程c13JAVA程序员培训定制课程c13,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报