第10章多线程讲义

合集下载

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多线程专题知识讲座

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章   多线程机制

例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)。

多线程技术的基本概念
– 什么是线程 – 线程的生命周期 – 多线程技术
什么是线程
• 线程和进程类似,是一段完成特定功能的代 码。线程是程序中单个程序的控制流,也是 一个进程内的基本调度单位。线程和进程一 样拥有独立的执行控制,并由操作系统负责 调度。
什么是线程
• 同一个进程可以包含多个线程,这些线程共 享属于该进程的一块内存空间和一组系统资 源,而线程自身的数据通常只有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的速度非常快, 用户感觉不到其中的区别,因此也不用关心 它,只需要设想各个线程是同时执行即可。
多线程技术
• 多线程和传统的单线程在程序设计上最大的 区别在于,由于各个线程的控制流彼此独立, 使得各个线程之间的代码是无序执行的。
相关文档
最新文档