java课件第七章线程

上传人:w****i 文档编号:92221535 上传时间:2019-07-08 格式:PPT 页数:32 大小:236.50KB
返回 下载 相关 举报
java课件第七章线程_第1页
第1页 / 共32页
java课件第七章线程_第2页
第2页 / 共32页
java课件第七章线程_第3页
第3页 / 共32页
java课件第七章线程_第4页
第4页 / 共32页
java课件第七章线程_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《java课件第七章线程》由会员分享,可在线阅读,更多相关《java课件第七章线程(32页珍藏版)》请在金锄头文库上搜索。

1、1,第七章 线程,7.1 线程概念 7.2 线程的生命周期 7.3 线程的实现 7.4 线程的优先级 7.5 多线程的同步 7.6 线程组,2,7.1 线程概念,什么是线程: 线程就是程序中单独顺序的流控制。线程本身不能运行,它只能用于程序中。,第七章 线程,3,7.1 线程概念,2. 什么是多线程: 多线程则指的是在单个程序中可以同时运行多个不同的线程执行不同的任务.,第七章 线程,4,7.1 线程概念,说明: 线程是程序内的顺序控制流,只能使用分配给程序的资源和环境。,第七章 线程,5,7.2 线程的生命周期,线程的生命周期:一个线程从创建到消亡的过程。 线程的生命周期可分为四个状态: 创

2、建状态 可运行状态 不可运行状态 4. 消亡状态,第七章 线程,6,7.2 线程的生命周期,线程的状态转换图:,第七章 线程,7,7.2 线程的生命周期,创建状态 当用new操作符创建一个新的线程对象时,该线程处于创建状态。 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源 此时只能调用start方法启动该线程,调用其它任何方法都会产生线程非法状态异常。,第七章 线程,8,7.2 线程的生命周期,2. 可运行状态 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体run()方法,这样就使得该线程处于可运行( Runnable )状态。 这一状态并不是运行

3、中状态(Running ),因为线程也许实际上并未真正运行。,第七章 线程,9,7.2 线程的生命周期,3.不可运行状态 当发生下列事件时,处于运行状态的线程会转入到不可运行状态。 调用了sleep()方法; 线程调用wait方法所等待的特定条件的满足 线程输入/输出阻塞,第七章 线程,10,7.2 线程的生命周期,返回可运行状态: 处于睡眠状态的线程在指定的时间过去后 如果线程在等待某一条件,另一个对象必须通过notify()或notifyAll()方法通知等待进程条件的改变 如果线程是因为输入/输出阻塞,输入/输出完成,第七章 线程,11,7.2 线程的生命周期,4. 消亡状态 当线程的r

4、un方法执行结束后,该线程自然消亡。,第七章 线程,12,7.3 线程的实现,在Java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法。 继承Thread类并重载run方法。 通过定义实现Runnable接口的类进而实现run方法。,第七章 线程,13,7.3 线程的实现,继承Thread类并重载run方法。 Thread类:是专门用来创建线程和对线程进行操作的类。Thread中定义了许多方法对线程进行操作。 Thread类在缺省情况下run方法是空的。可以通过继承Thread类并重写Thread类的run方法实现用户线程。,第七章 线程,14,7.3 线程的实现,继

5、承Thread类并重载run方法。 总体结构如下: public class MyThread extends Thread public void run() MyThread t = new MyThread(); t. start(); 见例题:TwoThreadsTest.java,第七章 线程,15,7.3 线程的实现,执行Runnable接口的类实现run方法。 通过建立一个实现了Runnable接口的对象,并以它作为线程的目标对象来创建一个线程。 Runnable接口:定义了一个抽象方法run()。定义如下: public interface java.lang.Runnable

6、 public abstract void run(); ,第七章 线程,16,7.3 线程的实现,执行Runnable接口的类实现run方法。 创建的总体框架如下: class MyRunner implements Runnable public void run() MyRunner r = new MyRunner(); Thread t = new Thread( ThreadGroup group, Runnable target, String name); 例如: Thread t = new Thread( r, “aa”); 见例题:ThreadTesterer.java/

7、 ThreadTest.java,第七章 线程,17,7.3 线程的实现,总结: 两种方法均需执行线程的start方法为线程分配必须的系统资源、调度线程运行并执行线程的run方法。 在具体应用中,采用哪种方法来构造线程体要视情况而定。通常,当一个线程已继承了另一个类时,就应该用第二种方法来构造,即实现Runnable接口。 线程的消亡不能通过调用一个stop()命令。而是让run()方法自然结束。 见例题: ThreadController.java,第七章 线程,18,7.4 线程的优先级,1. 线程的优先级及其设置 设置优先级是为了在多线程环境中便于系统对线程的调度,优先级高的线程将优先执

8、行。 一个线程的优先级设置遵从以下原则: 线程创建时,子进程继承父进程的优先级 线程创建后,可通过调用setPriority()方法改变优先级。 线程的优先级是1-10之间的正整数。 1 - MIN_PRIORITY, 10 MAX_PRIORITY 5- NORM_PRIORITY,第七章 线程,19,7.4 线程的优先级,线程的调度策略 线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行。 线程体中调用了yield()方法,让出了对CPU的占用权 线程体中调用了sleep()方法, 使线程进入睡眠状态 线程由于I/O操作而受阻塞 另一个更高优先级的线程出现。 在

9、支持时间片的系统中,该线程的时间片用完。,第七章 线程,20,7.4 线程的优先级,线程的调度策略 请看两个程序,一个线程的运行是友好的,另一个线程的运行是不友好的。 见例题: RaceTest1.java RaceTest2.java,第七章 线程,21,7.4 线程的优先级,Thread的一些常用方法。 测试 threads: isAlive() Thread priority: t getPriority() t setPriority() threads 进入非执行状态 Thread. sleep() Thread. yield(),第七章 线程,22,7.5 多线程的同步,为什么要引

10、入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源。必须对这种潜在资源冲突进行预防。 解决方法:在线程使用一个资源时为其加锁即可。访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁。,第七章 线程,23,7.5 多线程的同步,2. 怎样实现同步 对于访问某个关键共享资源的所有方法,都必须把它们设为synchronized 例如: synchronized void f() /* . */ synchronized void g() /* . */ 如果想保护某些资源不被多个线程同时访问,可以强制通过synchronized方法访问那些资源

11、。 调用synchronized方法时,对象就会被锁定。,第七章 线程,24,7.5 多线程的同步,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; ,第七章 线程,25,7.5 多线程的同步,2. 怎样实现同步 说明: 当synchronized方法执行完或发生异常时,会自动释放锁。 被synchroni

12、zed保护的数据应该是私有(private)的。,第七章 线程,26,7.5 多线程的同步,2. 怎样实现同步 同步的线程状态图:,第七章 线程,27,7.5 多线程的同步,怎样实现同步 线程间的相互作用: wait and notify The pools: Wait pool Lock pool,第七章 线程,28,7.5 多线程的同步,怎样实现同步 具有wait()和notify()的线程状态图:,第七章 线程,29,7.5 多线程的同步,怎样实现同步 让我们看一个同步的综合例题: 生产者和消费者问题。 Producer.java Consumer.java CubbyHole.java

13、 ProducerConsumerTest.java,第七章 线程,30,7.6 线程组,1. 线程组: 所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。 说明: 在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。 若创建多个线程而不指定一个组,它们就会与创建它的线程属于同一个组。,第七章 线程,31,7.6 线程组,例子: public Thread(ThreadGroup group, Runnable target) public Thread(ThreadGroup group, String name) public Thread(ThreadGroup group, Runnable target, String name) ThreadGroup myThreadGroup = new ThreadGroup( “My Group of Threads“); Thread myThread = new Thread(myThreadGroup, “a thread for my group“); theGroup = myThread.getThreadGroup();,第七章 线程,32,作 业,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号