第10章多线程讲义


多线程技术的基本概念
– 什么是线程 – 线程的生命周期 – 多线程技术
什么是线程
• 线程和进程类似,是一段完成特定功能的代 码。线程是程序中单个程序的控制流,也是 一个进程内的基本调度单位。线程和进程一 样拥有独立的执行控制,并由操作系统负责 调度。
什么是线程
• 同一个进程可以包含多个线程,这些线程共 享属于该进程的一块内存空间和一组系统资 源,而线程自身的数据通常只有CPU的寄存 器数据,以及一个供程序执行时使用的堆栈, 系统在产生一个线程,或者在各个线程之间 切换时,负荷比进程小得多。
线程的生命周期
– 运行(Running):线程获得了CPU资源正在执 行任务,将一直运行到结束,除非此时它自动放 弃资源或有更加高优先级的线程进入。
线程的生命周期
– 阻塞(Blcked):线程是可以执行的,但由于某 些因素的阻碍处于停滞状态,系统排程器略过了 应给线程的CPU执行时间。
– 死亡(Dead):线程的正式结束方式,run方法 执行完毕并返回。
什么是线程
• 此外,由于线程知识在单个进程的作用域内 活动,所以线程之间的通信也比进程简单。 线程的实现要依赖操作系统,现在一般操作 系统都支持线程技术。
什么是线程
• 一个或更多的线程构成了一个进程。一个线 程或执行上下文由一个虚拟处理机、CPU执 行的代码和代码操作的数据3个主要部分组 成。
线程执行的主要组成部分
多线程技术
• 多线程是这样一种机制,它允许在程序中并 发执行多个指令流,每个指令流都称为进程一样拥有独立的执行控制,由操 作系统负责调度,区别在于线程没有独立的 存储空间,而是和所属进程中的其它线程共 享一个存储空间,这使得线程间的通信比进 程简单。
多线程技术的实现
• 在了解了线程的基本概念之后,本节将继续 深入,介绍如何创建线程,如何实现多线程, 线程同步、死锁和调度等等多线程技术。
– 线程的创建 – 如何实现多线程
多线程技术的实现
– 线程同步 – 线程死锁 – 线程调度 – 应用举例——抢硬币
线程的创建
• 为了创建一个新的线程,必须指明这个线程 所要执行的代码,Java是通过类做到这一点 的。作为一个面向对象的程序设计语言, Java提供了ng.Thread类来进行多线 程编程,这个类提供了大量的方法给开发人 员控制自己的各个线程,以后的讨论都将围 绕这个类进行。
本章要点
• 线程的生命周期 • 多线程技术 • 线程的创建和实现多线程 • 线程的同步和死锁
多线程技术的基本概念
• 多线程是Java程序的一个重要特征,线程本 来是操作系统中的概念,Java将这一概念引 入到程序设计语言中,让开发人员利用线程 机制编写多线程程序,使系统能够同时运行 多个执行体,从而加快程序的响应速度,提 高电脑资源的利用率。本节主要介绍多线程 机制的一些基本概念。
线程的创建
• 那么如何提供给Java开发人员线程执行的代 码呢?通过Thread类来实现。主要有两种方 法。
– 继承Thread类,覆盖方法run() – 实现Runnable接口
继承Thread类,覆盖方法run()
• Thread类最重要的方法是run()方法,它为 Thread类的start()方法所调用,并提供线程 所要执行的代码。为了指定自己新的代码, 只需要覆盖它即可,即在创建的Thread类的 子类中重写run(),加入线程所要执行的代码。
第10章 多线程
• 学习目标 • 本章要点
•习 题
学习目标
• 在计算机处理任务时,往往需要操作系统同 时处理多个任务,这些任务就由操作系统本 身和CPU来控制。有时也需要自己创建多个 任务来让系统同时完成,这些用户自己定制 的任务都是非常小的程序段,称为线程。本 章介绍线程的基本概念和多线程技术,详细 讲解线程的创建,如何实现多线程,还介绍 线程同步、线程死锁和线程调度等控制技术。
什么是线程
• 代码可以由多个线程共享,也可以不被共享, 这些都和数据是独立的。两个线程如果执行 同一个类的实例代码,则它们可以共享相同 的代码。
什么是线程
• 类似地,数据可以由多个线程共享,也可以 不被共享,这些都和代码是独立的。两个线 程如果共享对一个公共对象的存取,则它们 可以共享相同的数据。
继承Thread类,覆盖方法run()
• 该方法的步骤是:从Thread类派生一个类, 覆盖Thread类中的run 方法,然后创建该子 类的对象,再调用start方法启动本线程。
• 【例10-1】 线程的创建(光盘:\源文件\第 10章\例10-1.txt)。
类“DrawLine”运行结果
类 “ D raw Line” 运 行 结 果
什么是线程
• 在Java编程中,虚拟处理机封装在Thread类 的一个实例。构造线程时,代码和数据是由 传递给它的构造方法的对象指定的。
线程的生命周期
• 每个Java程序都有一个默认的主线程,对于 Java Applicatin应用程序,主线程就是main 方法执行的指令序列,对于Java Applet,主 线程指挥浏览器装载并执行Java Applet。
• 线程在它完整的生命周期中包括新建、就绪、 运行、阻塞和死亡5种状态。
线程的生命周期
– 新建(New):代表线程的对象已经被初始化, 但尚未运行run方法。
– 就绪(Runnable):线程正在运行run方法,但 这只说明线程目前处于的状态。如果系统没有能 力抽出CPU执行时间给线程,线程就“不执 行”,这里的“不执行”不代表“阻塞”或“死 亡”。
多线程技术
• 多个线程的执行是并发的,也就是在逻辑上 “同时”,而不管是否是物理上的“同时”。 如果系统只有一个CPU,那么真正的“同时” 是不可能的,但是由于CPU的速度非常快, 用户感觉不到其中的区别,因此也不用关心 它,只需要设想各个线程是同时执行即可。
多线程技术
• 多线程和传统的单线程在程序设计上最大的 区别在于,由于各个线程的控制流彼此独立, 使得各个线程之间的代码是无序执行的。
合集下载

java学习第10章PPT教学课件

java学习第10章PPT教学课件
由调度程序调用,当run()方法返回时, 该线程停止
使调用它的线程立即停止执行
使线程睡眠n毫秒,n毫秒后,线程可以 再次运行
使线程挂起,暂停运行Not Runnable
恢复挂起的线程,使处于可运行状态 Runnable
将CPU控制权主动移交到下一个可运行 线程
2、Thread类的主要方法
setName(String) getName() getPriority() setPriority(int) join()
赋予线程一个名字
取得由setName()方法设置的线程名字的 字符串
返回线程优先级
设置线程优先级
当前线程等待调用该方法的线程结束后, 再往下执行
setDaemon(boole an )
设置该线程是daemon线程还是用户线程, Daemon线程也称服务线程,通常编 成无限循环,在后台持续运行。
例10-1 直接继承Thread类实现多线程
第10章 多线程机制
1.1 Java线程的概念 1.2 Java多线程编程方法 1.3 线程的控制 1.4 线程资源的同步处理
1.多进程
多进程的缺点: • 进程切换开销大; • 进程间的通信很不方便。
2.多线程
• 多线程则指的是在单个程序中可以同时运行多个 不同的线程,执行不同的任务
• 线程切换的开销小 。
例10-2 计数按钮的设计
import java.applet.*; import java.awt.*; class countbutton extends Button implements Runnable {
int count=0; public countbutton(String s) { super(s); } public void run() {

Java程序设计教程-电子教案 第10章 Java多线程

Java程序设计教程-电子教案  第10章 Java多线程

10.2 线程的生命周期
3.中断
处于运行状态的线程必须在运行一段时间 后让出计算机资源,这就是线程的中断。中断 原因包括:
阻塞 线程调度器的控制 通过sleep(long mill)方法 通过wait()方法
10.2 线程的生命周期
当线程中断解除时(例如:通过Scanner类的 方法输入了数据、经过mill毫秒后休眠结束),线
10.1 Java多线程处理机制
在Java语言的运行环境中(JVM),内置 了一个线程调度器,用于确定某一时刻由哪一 个线程占用计算机资源进行执行,从而实现了 多线程操作。当Java程序开始运行时,main() 方法首先执行,此时线程调度器会开启一个线 程,即为主线程(Java Applet的主线程是Web 浏览器),负责main()方法的执行,除主线程 之外的线程被称为其它线程。
10.3 创建线程的方法
例10-2 import java.util.Date; import java.awt.Graphics; public class Example10_2 extends java.applet.Applet implements Runnable{ Thread clockThread; public void start(){ if (clockThread == null){ clockThread = new Thread(this, "Clock"); clockThread.start(); } }
程并不会立刻返回运行状态,而是重新进入等待队
列进行排队,并依据队列先进先出的使用原则,占 用计算机资源,进入运行状态。 4.死亡 线程执行完毕后,就进入了最后的死亡状态, 线程的生命周期同时结束。

Java多线程PPT课件

Java多线程PPT课件
线程又称为轻量级进程,它和进程一样拥有独立的执行控制, 由操作系统负责调度,区别在于线程没有独立的存储空间, 而是和所属进程中的其它线程共享一个存储空间。这使得线 程间的通信远较进程简单,而进程之间的通信则比较困难, 另外在资源的占用上,线程比进程要小。
5
线程(Thread)和进程(Process)的关系很紧密,进程和 线程是两个不同的概念,进程的范围大于线程。
7
执行主线程示例。
//MainThreadDemo.java public class MainThreadDemo { public static void main(String args[]) { Thread t = Thread.currentThread(); System.out.println("当前线程名称是: " + t.getName()); t.setName("MyJavaThread"); System.out.println("改名后线程名称是: " + t.getName());
}
}
11
最初,程序员们用所掌握的有关机器底层的 知识来编写中断服务程序,主进程的挂起是 通过硬件中断来触发的。
尽管这么做可以解决问题,但是其难度太大, 而且不能移植,所以使得将程序移植到新型 号的机器上时,既费时又费力。
12
我们只是想把问题切分成多个可独立运行的 部分(任务),从而提高程序的响应能力。 在程序中,这些彼此独立运行的部分称之为tem.out.println("传送文件2");
Thread.sleep(100 * 10);
System.out.println("文件2传送完毕");

多线程ppt课件

多线程ppt课件
mt.start(); mt.join(); Thread.sleep(3000); mt.start(); } }
输 出:Exception in thread "main" ng.IllegalThreadStateExce ption
说明:通过Thread实例的start(),一个Thread的实例只能产生一个线程
高性能: 多线程的目的是为了增加程序运 行的性能
2. Java线程概念
对线程的综合支持是Java技术的一个重要特 色.它提供了thread类、监视器和条件变量的 技术.
虽然许多操作系统支持多线程,但若要用C或 C++编写多线程程序是十分困难的,因为它们 对数据同步的支持不充分.
线程对象和线程的区别:
public class Test { public static void main(String[] args) throws Exception
{ for(int i=0;i<10;i++) { Thread t = new MyThread(); t.start(); }
Thread.sleep(10000);//让上面的线程运行完成 R r = new R(); for(int i=0;i<10;i++)
mythread t1=new mythread(); public void init(){ t1.start();} class mythread extends Thread { public void run() { for (int i=0;i<4;i++) System.out.println( " "+i); {

第10讲 Java多线程

第10讲 Java多线程

据空间(进程的上下文),在两个文件复制进程间切换
需要额外 的开销,这样反而比先执行完C盘到D盘的复
制,再启动E盘向F盘的复制慢。
J2EE_Struts
7
© 2010 IBM Corporation
IBM 课程体系
进程与什线么程是的线程概念
线程是进程中的实体,进程是线程的集合。 在单线程应用中,程序代码按调用顺序依次往下执行,在这种情 况下,当主函数(方法)调用了子函数(方法),主函数必须等待子 函数返回后才能继续往下执行,不能实现两段程序代码同时交替 运行的效果。如果要一个程序中实现多段代码同时交替运行,就 需要产生多个线程,并指定每个线程上所要运行的程序代码,这 就是多线程。
t.setDaemon(true); 设置为后台线程 t.start();
}
}
J2EE_Struts
15
© 2010 IBM Corporation
IBM 课程体系
后台线联程合与线联程合线程
public class ThreadDemo implements Runnable{
public void run(){
while(true){
System.out.println("thread-1 is running");
}
}
public static void main(String[] agrs)throws Exception{
Thread t=new Thread(new ThreadDemo());
t.start();
new ThreadDemo().start(); 开启线程 }
}
J2EE_Struts
11

计算机技术-多线程

计算机技术-多线程
第十章 多线程
*
本讲内容【知 识 点】
多线程的基本概念 线程类(Thread)及其方法 Runnable接口 线程状态——线程的生命周期
*
本讲内容【案例】
并发显示字符串的简单例子 给程序添加一个时间显示控件 在程序窗口显示动画
*
1. 多线程的基本概念
并发现象在现代计算机中大量存在 操作系统提供并发机制 Java提供语言级并发机制
*
线程状态—线程的生命周期
born
ready
running
waiting
sleeping
dead
blocked
start
dispatch
quantum expiration yield
wait
sleep
run complete
issue I/O request
wait interval expires notify notifyAll interrupt
*
线程类(Thread)的其它方法
void interrupt() 中断线程, static boolean interrupted() 判断当前线程是否被中断(会清除中断状态标记) boolean isInterrupted() 判断指定线程是否被中断 boolean isAlive() 判断线程是否处于活动状态(即已调用start,但run还未返回) Thread currentThread() 返回当前线程对象的引用
*
关于Runnable接口
使得其它非Thread派生类也可以声明线程所应完成的任务(实现run方法) Thread(Runable ro) Thread(Runable ro, String threadNlete

java多线程专题知识讲座

线程旳Thread对象 public static void yield() ;使目前正在执行旳线程临时暂停,以
使其他旳线程运营 public final void wait(long timeout) throws InterruptedException;
目前线程被中断,并进入到一种对象旳等待列表中,直到另外旳 线程调用同一种对象上旳notify() 或notifyAll() 措施 public final void notify() ;用于将对象等待列表中旳任选旳一种 线程唤醒,使它再次成为可运营旳线程 public final void notifyAll();用于将对象等待列表中旳全部线程唤 醒,使它们再次成为可运营旳线程
9
类
这个类包括了创建和运营线程所需旳一切东西 构造函数:
public Thread(); public Thread(Runnable target); public Thread(String name);
参数阐明:
name:新线程对象旳名字
10
类 2-1
常用措施:
public void start();//开启该线程,将造成run措施被自动调用。 该措施将立即返回,新线程将运营
使用下述线措施取得或设置线程对象旳优先级 int getPriority(); void setPriority(int newPriority);
18
数据旳完整性
在大多数实际运营旳多线程应用程序中,两个或多种线程需要共 享对同一种对象旳访问。假如两个线程访问同一种对象,而且每 个线程都调用一种措施修改该对象旳状态,会出现什么情况?
2. 申明一种实现 Runnable 接口旳类,并实现 run() 措施。

课件:第10章 多线程机制


例10.2 通过Runnable接口运行线程。运行结果如图 所示。
import java.awt.*; import java.applet.Applet; import java.util.*; import java.text.DateFormat;
public class Clock2 extends Applet implements Runnable { Thread clockThread=null;
说明Ⅱ:通过例10.2可以了解如何结束一个无限循 环的线程。
• 一般设计线程自然结束。如例10.1通过定义循环 次数自然结束线程。
• 在例10.2中,进入循环的条件是 clockThread==myThread,怎样结束线程呢?当把 这个Applet嵌入网页后,用户关闭这个网页时, Applet的stop方法将被调用:
"+getPriority()+" 已计算完毕!"); } }
10.3 线程的调度与控制
10.3.1线程类的方法 1.线程的类方法 • 以下是Thread类的静态方法,即可以直接从
Thread类调用。 • CurrentThread() 返回正在运行的Thread对
象名称 • sleep(int n) 让当前线程休眠n毫秒
public void init() { setBackground(Color.blue); setForeground(Color.yellow); }
public void start() { if (clockThread==null) { clockThread=new Thread(this,"Clock2"); clockThread.start(); } } public void run() { Thread myThread=Thread.currentThread(); while (clockThread==myThread) { repaint(); try { Thread.sleep(1000); } catch (InterruptedException e) {} } }

第十章多线程

11
线程的生命周期
notify( )
CPU run( )
start( )
调度
sleep( )
stop( )
创建
就绪
运行
非运行
停止
wait( )
12
10.3 线程的创建与启动
Java中有两种方法来创建一个新的线程:
➢ 继承 Thread 类 ➢ 实现 Runnable 接口
无论采用哪种方法,都要用到Thread类及其相 关的方法。
➢ 例如,同一时刻一个线程A正在处理数据,而另 一个线程B开始读取该数据,线程B没有等到线 程A处理完数据就去读取数据,肯定会导致一个 错误的结果。
25
问题的解决
➢ Java采用synchronized关键字来给需要访问 共享数据的方法加锁;被加锁的方法称为同步 方法。
➢ 一次只能有一个同步方法是活动的,其他同步 方法必须等待该方法访问完共享数据才能访问 它。
线程不能独立存在,必须存在于进程内部, 多线程之间共享该进程的内存。
进程之间并发执行,而多线程则实现了进程 内部的并发计算。
7
传统进程的并发执行
传统进程1
传统进程 2
进程
单线程
单线程
并发执行
8
多线程进程的并发执行
多线程进程1
多线程进程2
多线程
多线程
进程内部
进程内部
并发执行
并发执行
并发执行
9
Java与多线程
每个线程都有自己的优先级,通常用三个常量表示:
① MAX_PRIORITY 10;
② MIN _PRIORITY 1;
③ NORM_PRIORITY 5;
➢ getPriority()
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档