《并行计算:Parallel Computing》 结构编程 算法应用 §3.3Java并发与并行程序 设计 徐悦牲Yueshen Xu) ysxu@xidian.edu.cn 软件工程系 西安电子科技大学
§3.3 Java并发与并行程序 设计 徐悦甡(Yueshen Xu) ysxu@xidian.edu.cn 软件工程系 西安电子科技大学 《并行计算:Parallel Computing》 结构 编程 算法 应用
本节提纲 历些毛子种拔大 XIDIAN UNIVERSITY ▣ava语言基础讨论 口ava并发程序设计 上节内容 ■Java多线程机制 ■Java中多线程的创建 >Thread方法途径 Java多线程编程 >Runnable接口途径 ■Java多线程程序举例 ■Java并行编程 Java并行编程 >Fork/Join 关键字:Java多线程 多线程创建 多线程举例 Java并行编程
本节提纲 Java语言基础讨论 Java并发程序设计 ◼ Java多线程机制 ◼ Java中多线程的创建 ➢ Thread方法途径 ➢ Runnable接口途径 ◼ Java多线程程序举例 ◼ Java并行编程 ➢ Fork/Join Java多线程编程 2 关键字:Java多线程 多线程创建 多线程举例 Java并行编程 上节内容 Java并行编程
Java多线程机制 历些毛子科枚大多 XIDIAN UNIVERSITY ▣Java中的多线程 ■操作系统按时间片轮流执行每个进程 ■ 在操作系统每次分给Java程序的一个时间片的CPU时间内,在若 干个独立的可控制的线程间切换 ■ 每个Java程序有一个默认的主线程 >VM加载代码,发现main方法后,就会启动一个线程,称为主线程 >与C、C++等语言类似,main方法也是Java程序的入口 ■若在main方法中创建了其他线程 >JVM就在主线程和其他线程间轮流切换,JVM等到所有线程结束后才结 束应用程序 注(复习):JVM,Java Virtual Machine,Java虚拟机 3
Java多线程机制 Java中的多线程 ◼ 操作系统按时间片轮流执行每个进程 ◼ 在操作系统每次分给Java程序的一个时间片的CPU时间内,在若 干个独立的可控制的线程间切换 ◼ 每个Java程序有一个默认的主线程[注] ➢ JVM加载代码,发现main方法后,就会启动一个线程,称为主线程 ➢ 与C、C++等语言类似,main方法也是Java程序的入口 ◼ 若在main方法中创建了其他线程 ➢ JVM就在主线程和其他线程间轮流切换,JVM等到所有线程结束后才结 束应用程序 注(复习):JVM,Java Virtual Machine,Java虚拟机 3
Java多线程机制 历些毛子代枝大等 XIDIAN UNIVERSITY 口Java多线程模型 JVM 代码 数据 /Code /Data 主线程 虚拟 线程1 线程2 线程3 CPU Java中的线程 ■Java内在支持多线程,ava可利用多线程实现并发编程 >Java中的线程可看作由三部分组成:Code,Data,Virtual CPU
Java多线程机制 Java多线程模型 JVM 主线程 线程1 线程2 线程3 ◼ Java内在支持多线程,Java可利用多线程实现并发编程 ➢ Java中的线程可看作由三部分组成:Code,Data, Virtual CPU 虚拟 CPU 代码 /Code 数据 /Data Java中的线程 4
Java多线程机制 历些毛子科枚大》 XIDIAN UNIVERSITY ▣Java中线程的状态 新建 其它阻塞 /O完成 l/O操作join()】 start() join时间到 ·调度 运行结束 强行终止 可运行 时间片到 运行 死亡 yield() 被抢占 休眠时间到 terrupt() sleep() 休眠阻塞 ait() notify() notifyAll( 获得互斥使用权 等待阻塞 访问同步方法 互斥阻塞 5
Java多线程机制 Java中线程的状态 新建 可运行 start( ) 死亡 运行结束 /强行终止 休眠阻塞 sleep( ) ` 休眠时间到 interrupt( ) 等待阻塞 wait( ) notify( ) notifyAll( ) 互斥阻塞 访问同步方法 ` 获得互斥使用权 其它阻塞 I/O完成 I/O操作 join( ) join时间到 运行 调度 时间片到 yield( ) 被抢占 5
Java多线程机制 历些毛子代枝大兽 XIDIAN UNIVERSITY ▣线程的生命周期与Java实现 ■同进程一样,一个线程也有从创建、运行到消亡的过程 >称为线程的生命周期 ■包括 > 创建(New)、可运行(Runnable)、运行中(Running)、 挂起(Not Runnable)、死亡(Dead)五种状态 ■Java多线程机制的实现 >java.lang中的线程类Thread封装了所有需要的线程操作控制 >提供了成熟的方法来控制一个线程的运行、休眠、挂起或停止 6
线程的生命周期与Java实现 ◼ 同进程一样,一个线程也有从创建、运行到消亡的过程 ➢ 称为线程的生命周期 ◼ 包括 ➢ 创建(New)、可运行(Runnable)、运行中(Running)、 挂起(Not Runnable)、死亡(Dead)五种状态 Java多线程机制 ◼ Java多线程机制的实现 ➢ java.lang中的线程类Thread封装了所有需要的线程操作控制 ➢ 提供了成熟的方法来控制一个线程的运行、休眠、挂起或停止 6
Java多线程机制 历些毛子种枝大学 XIDIAN UNIVERSITY ▣Java的默认多线程机制 ■在java中,每次程序运行至少启动2个线程 >一个是main线程,一个是垃圾收集线程 > 每当使用java命令执行一个类的时候,实际上都会启动一个JVM >每一个VM就是在操作系统中启动了一个进程 ■Java中线程的优先级 >Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三 个静态常量 -static int MAX PRIORITY,线程可以具有的最高优先级,取值为1O static int MIN_PRIORITY,线程可以具有的最低优先级,取值为1 -static int NORM PRIORITY,分配给线程的默认优先级,取值为5
Java多线程机制 Java的默认多线程机制 ◼ 在java中,每次程序运行至少启动2个线程 ➢ 一个是main线程,一个是垃圾收集线程 ➢ 每当使用java命令执行一个类的时候,实际上都会启动一个JVM ➢ 每一个JVM就是在操作系统中启动了一个进程 ◼ Java中线程的优先级 ➢ Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三 个静态常量 - static int MAX_PRIORITY,线程可以具有的最高优先级,取值为10 - static int MIN_PRIORITY,线程可以具有的最低优先级,取值为1 - static int NORM_PRIORITY,分配给线程的默认优先级,取值为5
Java多线程机制 历些毛子种枝大” XIDIAN UNIVERSITY 口多线程程序的实现 ■两种方法 >通过继承线程类Thread:来创建线程类; >建立一个实现Runnablea接口的类来创建线程 ■方法一(继承Thread) >过程 继续Threaad:类 重写run0方法 实例化自定义 线程类对象 调用start(0方法 启动run0方法
Java多线程机制 多线程程序的实现 ◼ 两种方法 ➢ 通过继承线程类Thread来创建线程类; ➢ 建立一个实现Runnable接口的类来创建线程 8 继续Threaad类 重写run()方法 实例化自定义 线程类对象 ◼ 方法一(继承Thread) ➢ 过程 调用start()方法, 启动run()方法
Java多线程机制 历些毛子科枚大多 XIDIAN UNIVERSITY ■ 方法一(继承Thread) class testThread extends Thread public testThread(String str){ super(str);∥调用父类的构造方法为线程像命名 关键字 注释 3 public void run({ for (int i=0;i<3;i++){ System.out.println(getName0+"在运行"); try sleep(1000);∥用休眠1000毫秒来区分哪个线程在运行 System.out.println(getName0+"在休眠"); catch(InterruptedException e){} }//try-catch ends System.out.println(getName0+"已结束"); 1}//run ends }//class ends 9
Java多线程机制 class testThread extends Thread { public testThread(String str) { super(str); //调用父类的构造方法为线程对象命名 } public void run() { for (int i=0; i<3; i++) { System.out.println(getName()+"在运行"); try { sleep(1000); // 用休眠1000毫秒来区分哪个线程在运行 System.out.println(getName()+"在休眠"); } catch (InterruptedException e) {} } //try-catch ends System.out.println(getName()+"已结束"); } //run ends } //class ends 9 ◼ 方法一(继承Thread) 关键字 注释
Java多线程机制 历些毛子种枝大” XIDIAN UNIVERSITY ■方法一(继承Thread,续) class Thread_Tester 关键字 注释 public static void main(String args[) { testThread t1=new testThread(“线程t1"); testThread t2=new testThread(“线程t2"); t1.start(); t2.start(); }//main ends }//class ends
Java多线程机制 ◼ 方法一(继承Thread,续) class Thread_Tester { public static void main(String args[]) { testThread t1=new testThread(“线程t1"); testThread t2=new testThread(“线程t2"); t1.start(); t2.start(); } //main ends } //class ends 关键字 注释