javase_09_多线程剖析

上传人:今*** 文档编号:105863332 上传时间:2019-10-13 格式:DOCX 页数:18 大小:233.12KB
返回 下载 相关 举报
javase_09_多线程剖析_第1页
第1页 / 共18页
javase_09_多线程剖析_第2页
第2页 / 共18页
javase_09_多线程剖析_第3页
第3页 / 共18页
javase_09_多线程剖析_第4页
第4页 / 共18页
javase_09_多线程剖析_第5页
第5页 / 共18页
点击查看更多>>
资源描述

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

1、1、纲要a) 多线程的基本概念 b) 线程的创建和启动 c) 线程的生命周期d) 线程的调度e) 线程控制f) 线程的同步 g) 守护线程h) 定时器的使用i) Windows 的任务计划2、内容2.1、多线程的基本概念线程指进程中的一个执行场景,也就是执行流程,那么进程和线程有什么区别呢?u 每个进程是一个应用程序,都有独立的内存空间u 同一个进程中的线程共享其进程中的内存和资源(共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的。)1.什么是进程? 一个进程对应一个应用程序。例如:在 windows 操作系统启动 QQ 就表示启动了一个 进程。在 java 的开发环境下启动 J

2、VM,就表示启动了一个进程。现代的计算机都是支持多进程的,在同一个操作系统中,可以同时启动多个进程。2.多进程有什么作用? 单进程计算机只能做一件事情。玩电脑,一边玩游戏(游戏进程)一边听音乐(音乐进程)。 对于单核计算机来讲,在同一个时间点上,游戏进程和音乐进程是同时在运行吗?不是。因为计算机的 CPU 只能在某个时间点上做一件事。由于计算机将在“游戏进程”和“音乐 进程”之间频繁的切换执行,切换速度极高,人类感觉游戏和音乐在同时进行。多进程的作用不是提高执行速度,而是提高 CPU 的使用率。 进程和进程之间的内存是独立的。3.什么是线程? 线程是一个进程中的执行场景。一个进程可以启动多个线

3、程。4.多线程有什么作用?5多线程不是为了提高执行速度,而是提高应用程序的使用率。 线程和线程共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个栈。 可以给现实世界中的人类一种错觉:感觉多个线程在同时并发执行。5.java 程序的运行原理?java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,表示启动了一个进程。该进程会自动启动一个“主线程”,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。在此之前的所有程序都是单线程的。分析一些程序启动几个线程?public class ThreadTestpublic static void mai

4、n(String args)m1();public static void m1()m2();public static void m2()m3();public static void m3()System.out.println(m3.);以上程序只要一个线程,就是主线程。main、m1、m2、m3这四个方法在同一个栈空间中。没有启动其他任何线程。2.2、线程的创建和启动Java 虚拟机的主线程入口是 main 方法,用户可以自己创建线程,创建方式有两种:u 继承 Thread 类u 实现 Runnable 接口(推荐使用 Runnable 接口)Thread 类中创建线程最重要的两个方法

5、为:u public void run() u public void start()采用 Thread 类创建线程,用户只需要继承 Thread,覆盖 Thread 中的 run 方法,父类 Thread中的 run 方法没有抛出异常,那么子类也不能抛出异常,最后采用 start 启动线程即可【示例代码】,不使用线程public class ThreadTest01 public static void main(String args) Processor p = new Processor(); p.run();method1();private static void method1(

6、) System.out.println(-method1()-);class Processor public void run() for (int i=0; i10; i+) System.out.println(i);以上顺序输出相应的结果(属于串行),也就是 run 方法完全执行完成后,才执行 method1方法,也就是 method1 必须等待前面的方法返回才可以得到执行,这是一种“同步编程模型”。1、继承Thread类:【代码示例】,使用线程public class ThreadTest02 public static void main(String args) /创建线程Th

7、read t = new Processor();/手动调用该方法/不能采用 run 来启动一个场景(线程),/run 就是一个普通方法调用/t.run();/start 不是马上执行线程,而是使线程进入就绪,告诉JVM分配一个新栈给t /线程的真正执行是由 Java 的线程调度机制完成的 /启动线程 p.start();/只能启动一次/p.start();method1(); /有了多线程后,main方法结束只是在主线程中没有栈帧了。 /但是其他线程或其他栈中还是栈帧仍在执行 /main方法结束后程序可能还在运行private static void method1() System.out

8、.println(-method1()-);/定义一个线程class Processor extends Thread /覆盖 Thread 中的 run 方法,该方法没有异常 /该方法是由 java 线程机制自动调用的 /我们不应该手动调用该方法public void run() for (int i=0; i10; i+) System.out.println(i);通过输出结果大家会看到,没有顺序执行,而在输出数字的同时执行了 method1()方法,如 果从效率上看,采用多线程的示例要快些,因为我们可以看作他是同时执行的,mthod1() 方法没有等待前面的操作完成才执行,这叫“异步编

9、程模型”2、实现 Runnable 接口:其实 Thread 对象本身就实现了 Runnable 接口,但一般建议直接使用 Runnable 接口来写多线 程程序,因为接口会比类带来更多的好处(线程类保留了继承)。【示例代码】public class ThreadTest03 public static void main(String args) /Processor r1 = new Processor(); Runnable r1 = new Processor();/不能直接调用 run/p.run();Thread t1 = new Thread(r1);/启动线程 t1.start

10、();method1();private static void method1() System.out.println(-method1()-);/实现 Runnable 接口class Processor implements Runnable /实现 Runnable 中的 run 方法public void run() for (int i=0; i10; i+) System.out.println(i);2.3、线程的生命周期线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡新建:采用 new 语句创建完成 就绪:执行 start 后 运行:占用 CPU 时间阻塞:执行了

11、wait 语句、执行了 sleep 语句和等待某个对象锁,等待输入的场合终止:退出 run()方法有的书籍上对线程的生命周期是做如下定义的。2.4、线程的调度与控制通常我们的计算机只有一个 CPU,CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU 时间片,也就是使用权,才可以执行指令。在单 CPU 的机器上线程不是并行运行的,只有 在多个 CPU 上线程才可以并行运行。Java 虚拟机要负责线程的调度,取得 CPU 的使用权, 目前有两种调度模型:分时调度模型和抢占式调度模型,Java使用抢占式调度型。分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的

12、时间片。抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。2.4.1、线程优先级线 程 优 先 级 主 要 分 三 种 : 1 10MAX_PRIORITY( 最 高 级 ) 10MIN_PRIORITY ( 最 低 级 ) 1NORM_PRIORITY(标准)默认 5/设置线程的优先级,线程启动后不能再次设置优先级/必须在启动前设置优先级public class ThreadTest04 public static void main(String args) Runnable r1 = new Proc

13、essor();/为线程设置自定义名称Thread t1 = new Thread(r1, t1);/设置最高优先级 t1.setPriority(Thread.MAX_PRIORITY);t1.start();/为线程设置自定义名称Thread t2 = new Thread(r1, t2);/设置最低优先级t2.setPriority(Thread.MIN_PRIORITY); t2.start();/获取当前(主)线程名称System.out.println(Thread.currentThread().getName();class Processor implements Runnable public void run() for (int i=0; i100; i+) System.out.prin

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

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

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