西南科技大学网络教育系列课程 高级语程序设计(Java) 第八章 线程.

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Java 程序设计 第 8 章 多线程. 第 8 章 Java 的多线程 8.1 线程及其创建 Java 中的线程 Java 程序通过流控制来执行程序流,程序中单个顺序的流 控制称为线程, 多线程则指的是在单个程序中可以同时运行 多个不同的线程执行不同的任务。 单个程序内部也可以在同一时刻进行多种运算。
面向侧面的程序设计 方林博士 本文下载地址:
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
第三讲 面向对象(上).
讓你的程式具有多工(Multitasking) 及多重處理(Multiprocessing)的能力
Java Programming Spring, 2010
第7章 多线程 北京大学计算机系 代亚非.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
第9章 Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第11章 Java多媒体技术.
线程与线程实现 主讲:赖国荣 QQ:
第二章 JAVA语言基础.
Ch07 介面與多重繼承 物件導向程式設計(II).
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 字符串.
Ch08 巢狀類別 物件導向程式設計(II).
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Java Applet 介绍.
Java语言程序设计 第七部分 多线程.
Multithread 多執行緒 I/O Lecturer:楊昌樺.
C#程序设计 c# programming 多线程 C#程序设计课程组.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
第22讲 Java高级编程(一).
Java程序设计 第9章 继承和多态.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
第10章 Java的线程处理 10.1 线程的基本概念 10.2 线程的属性 10.3 线程组 10.4 多线程程序的开发.
2018/12/7 Java语言程序设计-多线程 教师:段鹏飞.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C/C++/Java 哪些值不是头等程序对象
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
Multithread 多執行緒 以GUI為例了解物件以及Event
第7章 Java 的多线程机制.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
第二章 Java基本语法 讲师:复凡.
$9 泛型基础.
第7章 异常处理.
第9章 多线程 王德俊 上海交通大学继续教育学院.
分裂对象模型 C++ otcl.
信号量(Semaphore).
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
Chapter 18 使用GRASP的对象设计示例.
辅导课程十五.
第二章 Java基本语法 讲师:复凡.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
JAVA 程式設計與資料結構 第三章 物件的設計.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第二章 Java基础语法 北京传智播客教育
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

西南科技大学网络教育系列课程 高级语程序设计(Java) 第八章 线程

线程及相关概念 程序:计算机高级语言编写的代码,静态,是应用程序的蓝本。 进程:是程序的一次动态执行过程,进程包括所要执行的指令和所需的系统资源,不同的进程所占用的系统资源相对独立。 线程:比进程更小的执行单位,自身不能自动运行,必须栖身于某一进程之中,由该进程触发执行,属于同一进程的线程共享该进程的系统资源。 多进程:系统中多个程序同时执行(多任务)。 多线程:程序(进程)中多个片断同时执行。

Java程序执行的过程 当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程”,该线程负责执行main方法。 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会结束Java应用程序。 如果main方法中创建了其他线程,那么JVM就要保证每个线程都有机会使用CPU资源。 JVM一直要等到主线程中的所有线程都结束之后,才结束Java应用程序。

线程的生命周期 线程的五个生命周期 新建:新建的线程处于新建状态。 就绪:在创建线程后,它将处于就绪状态,排队等待进程调用。 运行:线程获得CPU资源后,就进入运行状态,开始执行。 阻塞:在线程等待一个事件时(例如输入/输出操作),就处于阻塞状态。 死亡:线程不再具有继续运行的能力。 线程完成了自己的任务。 线程被强迫终止。

新建状态 就绪状态 阻塞状态 运行状态 死亡状态 线程生命周期示意图

线程的优先级和调度调度 当一个在就绪队列中排队的线程被分配到处理器资源而进入运行状态之后,这个线程就称为被“调度”或被线程调度管理器选中了。 线程调度管理器负责管理线程排队和处理器在线程之间的分配 在java系统中,线程调度依据优先级基础上的“先到先服务”原则。

Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别。 优先级使用Thread类中的类常量表示。 static int MIN_PRIORITY 值为1 static int MAN_PRIORITY 值为10 static int NORM_PRIORITY 值为5 int getPriority() :返回线程的优先级。 void setPriority(int a)可以设置线程优先级。

线程的创建 创建线程有两种方法 继承Thread类 实现Runable接口 每个Java程序至少有一个叫做主线程的线程 Thread类的currentThread方法可以获取主线程(或当前线程)。 getName方法可以取得主线程(或当前线程) 的名字。 setName方法可以设置线程的名字。

main main thread public class mainthread { public static void main(String[ ] args) { Thread thread = Thread.currentThread(); System.out.println(thread.getName()); thread.setName(“main thread”); System.out.println(thread.getName()); } main main thread

继承Thread类 常用构造方法:public Thread() public Thread(String name) public Thread(Runnable target) Thread thread1 = new Thread(); Thread thread2 = new Thread(“second”); class TestThread extends Thread{ public TestThread(String name){ super(name); } ………… TestThread thread1 = new TestThread(“second”);

调用该方法启动线程,使线程从新建状态转入就绪状态并进入就绪队列。 public void run() Thread类的常用方法 public void start() 调用该方法启动线程,使线程从新建状态转入就绪状态并进入就绪队列。 public void run() Thread类中run()方法体为空,编写Thread类的子类时,需要在子类中覆盖父类的run()方法,该方法中包含了对线程的操作。 class mythread extends Thread { ………… public void run( ) { /* 覆盖该方法*/ }

需要注意的问题 程序需要建立自己的线程时,只需要创建一个已定义好的Thread子类的实例就行了。 当创建的线程调用start()方法开始运行时,run()方法将被自动执行。 当run()方法执行完毕,线程就释放内存。 在线程没有结束run()方法前,不赞成让线程再调用start()方法,否则将发生IllegalThreadStateException异常

public static void sleep(long millis) 优先级高的线程在它的run()方法中调用sleep方法来使自己放弃处理器资源,休眠一段时间。 public final boolean isAlive() 检查线程是否仍然在运行。 Static Thread currentThread() 判断当前正在占有CPU的线程。

public class LeftAndRight{ public static void main(String[] args){ Lefthand left; Righthand right; left=new Lefthand();//创建线程 right=new Righthand(); left.start();//线程开始运行后,Lefthand类中run方法被执行 right.start(); //线程开始运行后,Righthand类中run方法被执行 } } 运行结果: ABBABBABAA class Lefthand extends Thread{ public void run(){ for(int i=1;i<=5;i++){ System.out.printl(“A”); try{ sleep(500); } catch(InterruptedException e){} } } } class Righthand extends Thread{ public void run(){ for(int i=1;i<=5;i++){ System.out.print(“B”); try{ sleep(300); } catch(InterruptedException e){} } } }

实现Runnable接口 Runnabale接口只有一个方法run(),所有实现Runnable接口的类都必须具体实现run()方法,定义具体操作。 class mythread implements Runnable{ public void run( ){ /* 实现该方法*/ } 一个实现了Runnable接口的类实际上定义了一个主线程外的新线程的操作。

public Thread(Runnable target) 使用Runnable对象创建一个线程对象。 public Thread(Runnable target,String name) 使用Runnable对象创建一个线程对象。 参数target称为被创建线程的目标对象,创建目标对象的类负责实现Runable接口。 class runnable implements Runnable{ public runnable(){ Thread thread = new Thread(this, "second"); } public void(){ …………

线程的基本控制 检查线程 挂起线程 使用isAlive()方法检查线程是否在活动状态。 活动状态说明这个线程已经被启动,并不一定正在执行。 使用sleep()来延迟线程的执行。 通常,线程不是休眠期满后就立即被唤醒(start),重新调度的情况是: 被唤醒的线程具有更高的优先级。 正在执行的线程因为其他原因被阻塞。 程序处于支持时间片的系统中。

结束线程 自然结束:从run()结尾返回 public void interrupt(),当线程阻塞时,会抛出InterruptedException异常,所以往往需要调用public void isInterrupted()方法来判断线程的阻塞状态 不推荐使用的方法 public final void stop() public final void suspend() public final void resume()

线程同步 对象的锁定标志 当两个或多个线程同时访问同一个对象,且其中一个线程要修改这个对象,这时可能产生混乱,这就是典型的同步问题。 Java可以为每一个对象的实例分配一个标志,称为锁定标志,用来处理同步问题。 每个线程通过排队等待的方式获得这个锁定标志来独享对象。 synchronized提供了操作这个标志的方法。 当持有锁定标志的线程运行完synchronized调用包含的语句后,这个标志会被自动返回

例:会计和出纳共同拥有一个账本,他俩都可以使用存取方法对账本进行访问,但不能同时对账本的账目进行访问 同步方法 synchronized() 标准写法:public void test(){ synchronized(this){ …….. } } 简洁写法:public synchronized test(){ ………. } 例:会计和出纳共同拥有一个账本,他俩都可以使用存取方法对账本进行访问,但不能同时对账本的账目进行访问

使用wait()、notify()和notifyAll()进行线程间的交互 这种交互是通过队列来实现的。 wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承,且不允许重写的方法。

public final void wait() 使用wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。

public final void notifyAll() 只是通知第一个处于等待状态的线程结束等待,并唤醒它。 例:模拟两个人排队买票,张某、李某买电影票,售票员只有两张5元的钱,电影票5元一张。张某拿一张20元排在李的前面,李某排拿一张5元买票。

线程联合 一个线程A在占有CPU资源期间,可以让其它线程和本线程联合。 如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。

线程的联合使用方法join()实现 public final void join() 直到调用该方法的线程结束。 public final void join(long timeout) 挂起timeout毫秒,或直到线程结束,实际以二者中较少者为准 上述两个方法将抛出InterruptedException在程序中应予以捕捉