多线程ppt课件

上传人:aa****6 文档编号:54790144 上传时间:2018-09-19 格式:PPT 页数:45 大小:355.50KB
返回 下载 相关 举报
多线程ppt课件_第1页
第1页 / 共45页
多线程ppt课件_第2页
第2页 / 共45页
多线程ppt课件_第3页
第3页 / 共45页
多线程ppt课件_第4页
第4页 / 共45页
多线程ppt课件_第5页
第5页 / 共45页
点击查看更多>>
资源描述

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

1、Java多线程,02/17/11,Java多线程,2,Java多线程,进程与线程概念 创建和启动Java线程 线程状态和线程控制 多线程的互斥与同步 线程的通讯 死锁的概念,02/17/11,Java多线程,3,进程与线程,进程一般是对操作系统而言的。例如,你打开word编辑文档,同时打开outlook收取邮件。我们可以说这时系统内有两个进程在运行。即多个程序几乎在同一时间执行多个任务。 线程一般是对某一程序而言的。如上例,你打开outlook收新邮件的同时,还可以看已下载的邮件,这两件事没有相互干扰,那么我们说此时这一程序中至少有两个线程在运行。即每一个程序在同一时间内执行多个任务。,02/

2、17/11,Java多线程,4,进程与线程,从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待:,02/17/11,Java多线程,5,进程与线程,两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。 (可以看看win2000的任务管理器)不同进程的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。,02/17/11,Java多线程,6,多线程,02/17/11,Java多线程,7,线程和多线程,线程的

3、概念,02/17/11,Java多线程,8,线程的调度,调度策略 时间片抢占式:高优先级的线程抢占CPU Java的调度方法 同优先级线程组成先进先出队列,使用时间片策略 对高优先级,使用优先调度的抢占式策略,1,2,02/17/11,Java多线程,9,线程,虚拟的CPU,由java.lang.Thread类封装和虚拟CPU来实现。 CPU所执行的代码,传递给Thread类对象。 CPU所处理的数据,传递给Thread类对象。,代 码,数 据,虚拟CPU,Java线程模型,02/17/11,Java多线程,10,创建线程(二种方式及比较),通过java.lang.Thread来创建一个线程

4、Thread的常用构造器: Thread() Thread(Runnable target) Thread(Runnable target, String name) 并指定线程名称 Thread(String name),02/17/11,Java多线程,11,启动线程,每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。 使用start()方法,线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。 调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnable 而不是Running。 注意

5、,不要直接在程序中调用线程的run()方法。,02/17/11,Java多线程,12,创建并启动线程例子(例:TestThread),public class TestThread extends Threadpublic void run()for(int i = 0;i100;i+)System.out.println(“Count:“+i); public static void main(String args)TestThread tt = new TestThread();/注意,不要直接调用run方法tt.start(); ThreadOneTypeTest.java,02/17

6、/11,Java多线程,13,使用Runnable接口,优点是由于继承了Thread后,类再不能继承别的类,所以一般我们采用实现unnable接口的方法来创建线程。 提供一个实现接口Runnable的类,实现run()方法。 得到这个类的实例A。 New 一个Thread对象,同时A作为参数传入。例如:Thread runner=new Thread(A); 调用start启动线程例如:runner.start();,02/17/11,Java多线程,14,用Runnable创建线程(例: RunnableThread ),public class RThread implements Run

7、nable/实现接口Runnable中的run方法public void run()for (int k = 0;k10;k+)System.out.println(“Count:“+k); Runnable,02/17/11,Java多线程,15,Runnable接口,使用Runnable接口 可以将CPU,代码和数据分开,形成清晰的模型;通过Thread构造一个虚拟CPU 还可以从其他类继承; 直接继承Thread类 不能再从其他类继承; 编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,02/17/11,Java多线程,16,线程的调度,Java提供一个

8、线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。,02/17/11,Java多线程,17,线程的调度,下面几种情况下,当前线程会放弃CPU: 线程调用了yield(),sleep()方法主动放弃; 由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞; 为等候一个条件变量,线程调用wait()方法; 抢先式系统下,有高优先级的线程参与调度,02/17/11,Java多线程,18,线程的优先级,线程的优先级用数字来表示,范围从1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一个线

9、程的缺省优先级是5,即Thread.NORM_PRIORITY。下述方法可以对优先级进行操作:int getPriority(); /得到线程的优先级 void setPriority(int newPriority); /当线程被创建后,可通过此方法改变线程的优先级 注意:并不是所有的操作系统都支持所有级别。 SimplePriorities.java,02/17/11,Java多线程,19,线程让步和睡眠,对于程序员来说,在编程时要注意给每个线程执行的时间和机会,主要是通过让步(yield()方法)或者让线程睡眠的办法(调用sleep()方法)来让当前线程暂停行一段时间,然后由其它线程来争

10、夺执行的机会。TestThread5.java 示例TestThread3.java,02/17/11,Java多线程,20,线程的join方法(例:TestJoin),Thread API 包含了等待另一个线程完成的方法:join() 方法。当调用 join() 时,调用线程将阻塞,直到目标线程完成为止。 join() 通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。 isAlive 方法,判断线程是否在活动状态,返回布尔值。,02/17/11,Java多线程,21,线程的join方法(例:TestJoin)

11、,JoinThread r = new JoinThread();Thread t = new Thread(r);t.start();tryt.join();catch(InterruptedException e)TestJoin.java,02/17/11,Java多线程,22,Daemon线程(守护线程或精灵线程),守护线程是为其它线程提供服务的线程,它一般应该是一个独立的线程,它的run()方法是一个无限循环。 可以用方法public boolean isDaemon()确定一个线程是否守护线程,也可以用方法public void setDaemon( boolean )来设定一个线

12、程为守护线程。 守护线程与其它线程的区别是,如果守护线程是唯一运行着的线程,程序会自动退出。 典型的如隐藏的系统线程如垃圾收集线程simpleDaemon.java,02/17/11,Java多线程,23,线程状态,Runnable,Running,Blocked,New,start(),run() 运行完毕,线程调度,阻塞事件,解除阻塞,Dead,02/17/11,Java多线程,24,线程的启动和调度,02/17/11,Java多线程,25,线程控制,02/17/11,Java多线程,26,中断线程,1.对于睡眠(sleep())或等待(wait()状态的线,调用interrupt(),在

13、interruptedException中捕获并处理。 2.对于非睡眠或等待状态的线程,调用interrupt()并不产生InterruptedException异常。 Interrupt.java,02/17/11,Java多线程,27,终止线程,终止线程的唯一方法,是使run()执行结束。 结束run()运行的方法: 设置线程运行结束标志(stopFlag)while (!stopFlag) 当调用sleep、wait、join而处于阻塞状态时,可调用interrupt方法退出阻塞。interrupted()方法检测线程是否被中断while (!interrupted() 以上方法可结合使

14、用while (!stopFlag & !interrupted) 线程终止后,不能通过start方法重新启动 TestThread4.java,02/17/11,Java多线程,28,Thread类常用方法,static Thread currentThread() 返回对当前正在执行的线程对象的引用。 String getName() 返回该线程的名称。 int getPriority() 返回线程的优先级。 void interrupt() 中断线程。 static boolean interrupted() 测试当前线程是否已经中断。 boolean isAlive() 测试线程是否处

15、于活动状态。 boolean isDaemon() 测试该线程是否为守护线程。 boolean isInterrupted() 测试线程是否已经中断。 void join() 等待该线程终止。 void join(long millis) 等待该线程终止的时间最长为 millis 毫秒。 void join(long millis, int nanos) 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。 void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 void setName(String name) 改变线程名称,使之与参数 n

16、ame 相同。 void setPriority(int newPriority) 更改线程的优先级。 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。 void stop() 停止线程运行 String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 static void yield() 暂停当前正在执行的线程对象,并执行其他线程。,02/17/11,Java多线程,29,多线程的互斥与同步,前面所提到的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。,02/17/11,Java多线程,

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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