Java精解案例教程 第13课线程.ppt

上传人:s****8 文档编号:67349413 上传时间:2022-12-24 格式:PPT 页数:27 大小:110KB
返回 下载 相关 举报
Java精解案例教程 第13课线程.ppt_第1页
第1页 / 共27页
Java精解案例教程 第13课线程.ppt_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《Java精解案例教程 第13课线程.ppt》由会员分享,可在线阅读,更多相关《Java精解案例教程 第13课线程.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第十三章第十三章线线 程程 本章内容线程的概念模型线程的概念模型线程的创建和启动线程的创建和启动线程的状态控制线程的状态控制临界资源、对象锁和死锁临界资源、对象锁和死锁线程的互斥和同步线程的互斥和同步什么是线程线程是线程是一个程序内部一个程序内部的的顺序控制流顺序控制流。线程和进程线程和进程每每个个进进程程都都有有独独立立的的代代码码和和数数据据空空间间(进进程程上上下下文文),进程切换的开销大。进程切换的开销大。线线程程:轻轻量量的的进进程程,同同一一类类线线程程共共享享代代码码和和数数据据空空间间,每每个个线线程程有有独独立立的的运运行行栈栈和和程程序序计计数数器器(PC),线线程程切切换

2、的开销小。换的开销小。多进程多进程:在操作系统中能同时运行多个任务在操作系统中能同时运行多个任务(程序程序)多线程多线程:在同一应用程序中有多个顺序流同时执行在同一应用程序中有多个顺序流同时执行线程的概念模型 虚拟的虚拟的CPU,由由java.lang.Thread类封装和虚拟类封装和虚拟 CPU所执行的代码,传递给所执行的代码,传递给Thread类对象。类对象。CPU所处理的数据,传递给所处理的数据,传递给Thread类对象。类对象。代 码数 据虚拟虚拟CPUJava线程模型线程模型线程体Java的线程是通过的线程是通过java.lang.Thread类类来实现的。来实现的。每个线程都是通过

3、某个特定每个线程都是通过某个特定Thread对对象所对应的方法象所对应的方法run()来完成其操作的,来完成其操作的,方法方法run()称为线程体。称为线程体。创建线程创建线程-通过实现通过实现通过实现通过实现RunnableRunnable接口(接口(接口(接口(13011301)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

4、 void run()for(int i=0;i30;i+)System.out.println(No.+i);多线程 Java中引入线程机制的目的在于实现多线程中引入线程机制的目的在于实现多线程可可以以使使用用同同一一个个Runnable接接口口(的的实实现现类类)类类型的实例构造多个线程型的实例构造多个线程多线程之间可以共享代码和数据多线程之间可以共享代码和数据 举例Thread t1=new Thread(r);Thread t2=new Thread(r);多线程举例public class TestThread2 public static void main(String args

5、)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()for(int i=0;i30;i+)System.out.println(No.+i);多线程共享数据和代码class MyRunner implements Runnable class YourRunner implements Runnable MyRunner m =new MyRunner();

6、YourRunner y1=new YourRunner();YourRunner y2=new YourRunner();Thread t1=new Thread(m);Thread t2=new Thread(y1);Thread t3=new Thread(y2);Thread t4=new Thread(y2);线程虚拟CPU代 码数 据t1Thread类对象t1Runner2类中的run方法Runner2类型对象rt2Thread类对象t2Runner2类中的run方法Runner2类型对象r启动线程使用使用start()方法启动线程方法启动线程启启动动线线程程是是使使线线程程进进入

7、入到到可可运运行行(runnable)状态,并不一定立即开始执行该线程状态,并不一定立即开始执行该线程 public class TestThread1 public static void main(String args)Runner1 r=new Runner1();Thread t=new Thread(r);t.start();线程状态转换(Thread Scheduling)线程状态转换举例public class TestThread3public static void main(String args)Runner3 r=new Runner3();Thread t=new

8、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);终止线程控制举例public class TestThread4 public static void main(String args)Runner4 r=new Runner4();Thread t=new Thread(r);t.

9、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 void shutDown()flag=false;线程控制基本方法方方 法法功功 能能isAlive()判

10、断线程是否还判断线程是否还“活活”着,即线程是否还未终止。着,即线程是否还未终止。getPriority()获得线程的优先级数值获得线程的优先级数值setPriority()设置线程的优先级数值设置线程的优先级数值Thread.sleep()将当前线程睡眠指定毫秒数将当前线程睡眠指定毫秒数join()调调用用某某线线程程的的该该方方法法,将将当当前前线线程程与与该该线线程程“合合并并”,即即等等待待该该线线程程结结束束,再再恢恢复复当当前前线线程程的的运运行。行。yield()让出让出CPU,当前线程进入就绪队列等待调度。当前线程进入就绪队列等待调度。wait()当前线程进入对象的当前线程进入

11、对象的wait pool。notify()/notifyAll()唤醒对象的唤醒对象的wait pool中的一个中的一个/所有等待线程。所有等待线程。join方法用法举例public 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

12、Runner5 implements Runnable public void run()for(int i=0;i50;i+)System.out.println(SubThread:+i);创建线程的第二种方式 -继承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(SubT

13、hread:+i);两种创建线程方法的比较使用使用Runnable接口接口可以将CPU,代码和数据分开,形成清晰的模型;还可以从其他类继承;保持程序风格的一致性。直接继承直接继承Thread类类不能再从其他类继承;编写简单,可以直接操纵线程,无需使用Thread.currentThread()。线程的调度Java提提供供一一个个线线程程调调度度器器来来监监控控程程序序中中启启动动后后进进入入就就绪绪状状态态的的所所有有线线程程。线线程程调调度度器器按按照照线线程程的的优优先先级决定应调度哪些线程来执行。级决定应调度哪些线程来执行。setPriority(int)方法设置优先级方法设置优先级多数

14、线程的调度是抢先式的。多数线程的调度是抢先式的。时间片方式时间片方式非时间片方式非时间片方式下面几种情况下,当前线程会放弃下面几种情况下,当前线程会放弃CPU:线线程程调调用用了了yield(),suspend()或或sleep()方方法法主主动动放弃;放弃;由由于于当当前前线线程程进进行行I/O访访问问,外外存存读读写写,等等待待用用户户输输入等操作,导致线程阻塞;入等操作,导致线程阻塞;为等候一个条件变量,线程调用为等候一个条件变量,线程调用wait()()方法;方法;抢抢先先式式系系统统下下,有有高高优优先先级级的的线线程程参参与与调调度度;时时间间片片方方式式下下,当当前前时时间间片片

15、用用完完,有有同同优优先先级级的的线线程程参参与调度。与调度。线程的调度线程的优先级线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用下述线方法获得或设置线程对象的优先级int getPriority();void setPriority(int newPriority);在在Java语语言言中中,引引入入了了对对象象互互斥斥锁锁的的概概念念,来来保保证共享数据操作的完整性。证共享数据操作的完整性。每每个个对对象象都都对对应应于于一一个个可可称

16、称为为“互互斥斥锁锁”的的标标记记,这这个个标标记记用用来来保保证证在在任任一一时时刻刻,只只能能有有一一个线程访问该对象。个线程访问该对象。关关键键字字synchronized 来来与与对对象象的的互互斥斥锁锁联联系系。当当某某个个对对象象用用synchronized修修饰饰时时,表表明明该该对对象在任一时刻只能由一个线程访问象在任一时刻只能由一个线程访问。互斥锁关键字Synchronized用法举例 public void push(char c)synchronized(this)dataidx=c;idx+;public char pop()synchronized(this)idx-

17、;return dataidx;关键字关键字Synchronizedsynchronized 除除了了象象上上面面放放在在对对象象前前面面限限制制一一段段代代码码的的执执行行外外,还还可可以以放放在在方方法法声声明明中,表示整个方法为同步方法。中,表示整个方法为同步方法。public synchronized void push(char c)如如果果synchronized用用在在类类声声明明中中,则则表表明明该类中的所有方法都是该类中的所有方法都是synchronized的。的。public synchronized class Stack生产者-消费者问题(1)生产者:class Pro

18、ducer 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)消费者:消费者:class Consumer implements Runnab

19、leSyncStack 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)生产者-消费者问题(2)生产者-消费者问题(3)主程序:主程序: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();本章内容本章内容线程的概念模型线程的概念模型线程的创建和启动线程的创建和启动线程的状态控制线程的状态控制临界资源、对象锁和死锁临界资源、对象锁和死锁线程的互斥和同步线程的互斥和同步

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁