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

上传人(卖家):晟晟文业 文档编号:4032923 上传时间:2022-11-05 格式:PPT 页数:31 大小:166.98KB
下载 相关 举报
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、第十三章1线程的概念模型线程的创建和启动线程的状态控制临界资源、对象锁和死锁线程的互斥和同步2线程是一个程序内部的顺序控制流。线程和进程每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个顺序流同时执行3 虚拟的CPU,由java.lang.Thread类封装和虚拟 CPU所执行的代码,传递给Thread类对象。CPU所处理的数据,传递给Thread类对象。代 码数 据虚拟CPUJava线程模型4

2、Java的线程是通过java.lang.Thread类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。5-public class TestThread1 public static void main(String args)Runner1 r=new Runner1();Thread t=new Thread(r);t.start();class Runner1 implements Runnable public void run()for(int i=0;i30;i+)System.out.println(No.+i);

3、6 Java中引入线程机制的目的在于实现多线程可以使用同一个Runnable接口(的实现类)类型的实例构造多个线程多线程之间可以共享代码和数据 举例Thread t1=new Thread(r);Thread t2=new Thread(r);7public 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 implemen

4、ts Runnable public void run()for(int i=0;i30;i+)System.out.println(No.+i);8class MyRunner implements Runnable class YourRunner implements Runnable MyRunner m =new MyRunner();YourRunner y1=new YourRunner();YourRunner y2=new YourRunner();Thread t1=new Thread(m);Thread t2=new Thread(y1);Thread t3=new T

5、hread(y2);Thread t4=new Thread(y2);线程虚拟CPU代 码数 据t1Thread类对象t1Runner2类中的run方法Runner2类型对象rt2Thread类对象t2Runner2类中的run方法Runner2类型对象r9使用start()方法启动线程启动线程是使线程进入到可运行(runnable)状态,并不一定立即开始执行该线程 public class TestThread1 public static void main(String args)Runner1 r=new Runner1();Thread t=new Thread(r);t.start

6、();1011public class TestThread3public static void main(String args)Runner3 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&i!=0)tryThread.sleep(2000);catch(InterruptedException e)System.out.println(No.+i);12public class

7、 TestThread4 public static void main(String args)Runner4 r=new 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;w

8、hile(flag=true)System.out.print(+i+);public void shutDown()flag=false;13方 法功 能isAlive()判断线程是否还“活”着,即线程是否还未终止。getPriority()获得线程的优先级数值setPriority()设置线程的优先级数值Thread.sleep()将当前线程睡眠指定毫秒数join()调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。yield()让出CPU,当前线程进入就绪队列等待调度。wait()当前线程进入对象的wait pool。notify()/notifyA

9、ll()唤醒对象的wait pool中的一个/所有等待线程。14public class TestThread5 public static void main(String args)Runner5 r=new Runner5();Thread t=new Thread(r);t.start();try t.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

10、;i50;i+)System.out.println(SubThread:+i);15 -继承Thread类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);16使用使用Runnable接口接口可以将CPU,代码和数据分开,形成清晰的模型;还可以从其他类继承;保持程

11、序风格的一致性。直接继承直接继承Thread类类不能再从其他类继承;编写简单,可以直接操纵线程,无需使用Thread.currentThread()。171.分析并运行M13-6页的例子,体会通过实现Runnable接口创建线程的过程;2.细化M13-16页程序,体会并实现通过继承Thread类创建线程,并要求实现下述输出结果:连续输出26个大写字母A Z;18 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。setPriority(int)方法设置优先级多数线程的调度是抢先式的。时间片方式非时间片方式19下面几种情况下,

12、当前线程会放弃CPU:线程调用了yield(),suspend()或sleep()方法主动放弃;由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞;为等候一个条件变量,线程调用wait()方法;抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度。20线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用下述线方法获得或设置线程对象的优先级int getPriority();void s

13、etPriority(int newPriority);21临界资源问题(1)class Stack int idx=0;char data=new char6;public void push(char c)dataidx=c;idx+;public char pop()idx-;return dataidx;两个线程A和B在同时操纵Stack类的同一个实例(堆栈),A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据。221.操作之前 data=|a|b|idx=22.A执行push中的第一个语句,将c推入堆栈;data=|a|b|c|idx=23.A还未执行idx+语句,A的执行

14、被B中断,B执行pop方法,返回b:data=|a|b|c|idx=14.A继续执行push的第二个语句:data=|a|b|c|idx=2最后的结果相当于c没有入栈,产生这种问题的原因在于对共享数据访问的操作的不完整性。临界资源问题(2)23在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。24 public void push(char

15、c)synchronized(this)dataidx=c;idx+;public char pop()synchronized(this)idx-;return dataidx;25synchronized 除了象上面放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。public synchronized void push(char c)如果synchronized用在类声明中,则表明该类中的所有方法都是synchronized的。public synchronized class Stack26class SyncStack /支持多线程同步操作的堆栈的实现

16、private int index=0;private char data=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-;retur

17、n dataindex;27生产者:class Producer implements RunnableSyncStack 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)(Math.random()*100);catch(InterruptedException e)28消费者:class Cons

18、umer implements RunnableSyncStack stack;public Consumer(SyncStack s)stack=s;public void run()for(int i=0;i20;i+)char c=stack.pop();System.out.println(消费:+c);try Thread.sleep(int)(Math.random()*1000);catch(InterruptedException e)29主程序:public class SyncTest public static void main(String args)SyncStack stack=new SyncStack();Runnable p=new Producer(stack);Runnable c=new Consumer(stack);Thread t1=new Thread(p);Thread t2=new Thread(c);t1.start();t2.start();30Ex2 1.分析并运行本讲义中的生产者-消费者问题实现程序,体会共享数据的使用和线程同步的含义及其实现;2.其中堆栈类SyncStack的定义见M13-26页;31

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(JAVA程序员培训定制课程c13课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|