You are on page 1of 65

Java 的线程和 Applet

1 java 线程
2 多线程 的互斥与同 步
3 Java Applet

Object-Oriented Programme 1
1 java 线程
 1.1 线程的 概念模 型
 1.2 线程体
 1.3 线程的 调度
 1.4 基本的 线程控 制

Object-Oriented Programme 2
进程
 随着计算机的飞速发展,个人计算机上的操作系统
也纷纷采用多任务和分时设计
 计算机发展早期只有大型计算机才具有的系统特性。

 进程的概念
 一般可以在同一时间内执行多个程序的操作系统都有。
 一个进程就是一个执行中的程序,
 每一个进程都有自己独立的一块内存空间、一组系统资源
 在进程概念中,每一个进程的内部数据和状态都是完全独
立的

Object-Oriented Programme 3
Java 程序中的线程
 Java 程序通过流控制来执行程序流
 线程
 程序中单个顺序的流控制称为线程,

 多线程
 多线程则指的是在单个程序中可以同时运行多个
不同的线程,执行不同的任务。
 多线程意味着一个程序的多行语句可以看上去几
乎在同一时间内同时运行。

Object-Oriented Programme 4
线程与进程的比较
 相似之处
 都是一段完成某个特定功能的代码,
 都是程序中单个顺序的流控制;
 不同之处
 每一个进程都有自己独立的一块代码和数据空间空间、一组系统资源
(进程上下文),进程切换的开销大
 每一个进程的内部数据和状态都是完全独立的
 同类的多个线程是共享一块内存空间和一组系统资源,
 而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序
执行时使用的堆栈。同一类线程共享代码和数据空间,每个线程有独
立的运行栈和程序计数器( PC )。
 线程被称为轻量级进程( light-weight process )
 系统在生成一个新线程,或者线程切换时,负担要比进程小的多
 一个进程中可以包含多个线程

Object-Oriented Programme 5
多进程与多线程
 多进程
 在操作系统中,能同时运行多个任务程序。

 多线程
 在同一应用程序中,有多个顺序流同时执行。

Object-Oriented Programme 6
1.1 线程的概念模型
 Java 天生支持多线程,它的所有类都是在多
线程下定义的, Java 利用多线程使整个系统
成为异步系统。
 Java 中的线程由三部分组成,如图。
1. 虚拟的 CPU ,封装在 java.lang.Thread 类中。
2. CPU 所执行的代码,传递给 Thread 类。
3. CPU 所处理的数据,传递给 Thread 类。

Object-Oriented Programme 7
1. 2 线程体
 Java 的线程是通过继承 java.lang.Thread 类来实现的。
 生成一个 Thread 类的对象之后 , 一个新的线程就产生了。
 此线程实例表示 Java 解释器中的真正的线程,通过它可以启
动线程、终止线程、线程挂起等,
 每个线程都是通过类 Thread 在 Java 的软件包 Java.lang 中
定义,它的构造方法为:
 public Thread ( ThreadGroup group , Runnable target , String
name );
 group 指明该线程所属的线程组;
 target 实际执行线程体的目标对象,它必须实现接口 Runnable ;
 name 为线程名。
 Java 中的每个线程都有自己的名称, Java 提供了不同 Thread 类构造器
,允许给线程指定名称。如果 name 为 null 时,则 Java 自动提供唯一的
名称。
 每个线程都是通过某个特定 Thread 对象的方法 run( ) 来完成
其操作的,方法 run( ) 称为线程体。
Object-Oriented Programme 8
Thread 类构造方法
 public Thread()
 public Thread(Runnable target)
 public Thread(Runnable target, String name)
 public Thread(String name)
 public Thread(ThreadGroup
group , Runnable target)
 public Thread(ThreadGroup group, String
name)

Object-Oriented Programme 9
Runnable 接口
 一个类声明实现 Runnable 接口就可以充当线
程体
 接口 Runnable 中只定义了一个方法 run()
 public void run()
 任何实现接口 Runnable 的对象都可以作为一
个线程的目标对象
 类 Thread 本身也实现了接口 Runnable ,

Object-Oriented Programme 10
可以通过两种方法实现线程体
1. 定义一个线程类
 它继承线程类 Thread 并重写其中的方法 run() ,这时在
初始化这个类的实例时,目标 target 可为 null ,表示由
这个实例来执行线程体。
 由于 Java 只支持单重继承,用这种方法定义的类不能再
继承其它父类。
2. 提供一个实现接口 Runnable 的类作为一个线程的
目标对象,
 在初始化一个 Thread 类或者 Thread 子类的线程对象时
,把目标对象传递给这个线程实例,由该目标对象提供
线程体 run() 。
 实现接口 Runnable 的类仍然可以继承其它父类。
Object-Oriented Programme 11
线程状态以及状态之间转换
 java 线程的不同状态以及状态之间转换所调用的方

Object-Oriented Programme 12
线程状态
 1. 创建状 态 (new Thread)
 执行下列语句时,线程就处于创建状态:
Thread myThread = new MyThreadClass( );
 当一个线程处于创建状态时,它仅仅是一个空的线程对象
,系统不为它分配资源。
 2. 可运行 状态 ( Runnable )
Thread myThread = new MyThreadClass( );
myThread.start( );
 当一个线程处于可运行状态时,系统为这个线程分配了它
需的系统资源,安排其运行并调用线程运行方法,这样就
使得该线程处于可运行 ( Runnable ) 状态。
 注意
Running ) ,因为线程也许实际上并
 这一状态并不是运行中状态(
未真正运行。由于很多计算机都是单处理器的,所以要在同一时
刻运行所有的处于可运行状态的线程是不可能的, Java 的运行系
统必须实现调度来保证这些线程共享处理器。
Object-Oriented Programme 13
线程状态
 3. 不可运 行状 态( Not Runnable )
 进入不可运行状态的原因有如下几条:
1) 调用了 sleep () 方法 ;
2) 调用了 suspend () 方法 ;
3) 为等候一个条件变量,线程调用 wait () 方法 ;
4) 输入输出流中发生线程阻塞 ;
 不可运行状态也称为阻塞状态( Blocked )。
 因为某种原因(输入 / 输出、等待消息或其它阻塞情况)
,系统不能执行线程的状态。
 这时即使处理器空闲,也不能执行该线程。
 4. 死亡状 态( Dead )
 线程的终止一般可通过两种方法实现:自然撤消(线程执
行完)或是被停止(调用 stop() 方法)。
 目前不推荐通过调用 stop() 来终止线程的执行,而是让线
程执行完。
Object-Oriented Programme 14
线程体 的构造 实例
 Sample
code (SimpleThread.java) 说明如何
构造线程体的

Object-Oriented Programme 15
note
 会发现两个线程是交错运行的,感觉就象是两个线
程在同时运行。但是实际上一台计算机通常就只有
一个 CPU ,在某个时刻只能是只有一个线程在运行
 java 在设计时就充分考虑到线程的并发调度执行。
 程序员编程时要注意
 给每个线程执行的时间和机会
 主要是通过调用sleep() 方法让当前线程暂停执行
 然后由其它线程来争夺执行的机会。

 如果上面的程序中没有用到 sleep() 方法,则就是第


一个线程先执行完毕,然后第二个线程再执行完毕。
所以用活 sleep() 方法是学习线程的一个关键。
Object-Oriented Programme 16
 通过接口构造线程体的实例
 Sample
code (Clock.java)
 上面这个例子是通过每隔 1 秒种就执行线程的
刷新画面功能,显示当前的时间;看起来的效
果就是一个时钟,每隔 1 秒就变化一次。
 本例采用实现接口 Runnable 的方式,
Clock 还继承了 Applet, Clock 就可以 Applet
 该类
的方式运行。

Object-Oriented Programme 17
  构造线程体的两种方法的比较:
 1. 使用 Runnable 接口
 1) 可以将 CPU ,代码和数据分开,形成清晰的
模型 ;
 2) 还可以从其他类继承 ;
 3) 保持程序风格的一致性。

 2. 直接继承 Thread 类
 1) 不能再从其他类继承 ;
 2) 编写简单,可以直接操纵线程,无需使用
Thread.currentThread() 。

Object-Oriented Programme 18
1.3 线程的调度
 Java
提供一个线程调度器来监控程序中启动
后进入就绪状态的所有线程。线程调度器按照
线程的优先级决定应调度哪些线程来执行。
 线程调度器按线程的优先级高低选择高优先级
线程(进入运行中状态)执行
 同时线程调度是抢先式调度,即如果在当前线
程执行过程中,一个更高优先级的线程进入可
运行状态,则这个线程立即被调度执行。

Object-Oriented Programme 19
抢先式调度又分为时间片方式和独占方式
 时间片方式
 当前活动线程执行完当前时间片后,如果有其他
处于就绪状态的相同优先级的线程,系统会将执
行权交给其他就绪态同优先级线程;当前活动线
程转入等待执行队列,等待下一个时间片调度。
 独占方式
 当前活动线程一旦获得执行权,将一直执行下去
,直到执行完毕或由于某种原因主动放弃 CPU ,
或是有一高优先级的线程处于就绪状态。

Object-Oriented Programme 20
下面几种情况下,当前线程会放弃 CPU
 线程调用了 yield() 或 sleep() 方法主动放弃

 由于当前线程进行 I/O 访问,外存读写,等
待用户输入等操作,导致线程阻塞;或者是为
等候一个条件变量,以及线程调用 wait() 方法

 抢先式系统下,由高优先级的线程参与调度;
时间片方式下,当前时间片用完,由同优先级
的线程参与调度。

Object-Oriented Programme 21
线程的优先级
 线程的优先级用数字来表示,范围从 1 到 10,
即 Thread.MIN_PRIORITY 到
Thread.MAX_PRIORITY
 一个线程的缺省优先级是 5 ,即
Thread.NORM_PRIORITY
 下述方法可以对优先级进行操作:
int getPriority(); // 得到线程的优先级
void setPriority(int newPriority);
 当线程被创建后,可通过此方法改变线程的优
先级
Object-Oriented Programme 22
Sample code
 Sample
code(ThreadTest.java)
 例中生成三个不同线程,其中一个线程在最低
优先级下运行,而另两个线程在最高优先级下
运行
 注意
 并不是在所有系统中运行 Java 程序时都采用时间
片策略调度线程,所以一个线程在空闲时应该主
动放弃 CPU ,以使其他同优先级和低优先级的线
程得到执行。

Object-Oriented Programme 23
1.4 基本的线程控制
1 .终止线程
2 .测试线程状态
3 .线程的暂停和恢复

Object-Oriented Programme 24
终止线程
 线程终止后,其生命周期结束了,即进入死亡
态,终止后的线程不能再被调度执行,
 以下几种情况,线程进入终止状态:
 线程执行完run() 方法后,会自然终止。
 通过调用线程的实例方法 stop() 来终止线程。

Object-Oriented Programme 25
测试线程状态
 可以通过 Thread 中的 isAlive() 方法来获取
线程是否处于活动状态;
 线程由 start() 方法启动后,直到其被终止之
间的任何时刻,都处于 'Alive' 状态。

Object-Oriented Programme 26
线程的暂停和恢复
 有几种方法可以暂停一个线程的执行,在适当的时候再恢复
其执行。
 sleep() 方法
 当前线程睡眠(停止执行)若干毫秒,线程由运行中状态进入不可运行状
态,停止执行时间到后线程进入可运行状态。
 2) suspend() 和 resume() 方法
 线程的暂停和恢复,通过调用线程的 suspend() 方法使线程暂时由可运行
态切换到不可运行态,若此线程想再回到可运行态,必须由其他线程调用
resume() 方法来实现。
 注:从 JDK1.2 开始就不再使用 suspend() 和 resume() 。
 3) join()
 当前线程等待调用该方法的线程结束后 , 再恢复执行 .
TimerThread tt=new TimerThread(100);
tt.start();

public void timeout(){
tt.join();// 当前线程等待线程 tt 执行完后再继续往下执行

Object-Oriented Programme 27
2 多线程 的互斥与同 步
 2.1 互斥锁
 2.2 多线程的同 步

Object-Oriented Programme 28
多线程 的互斥与同 步
 到目前为止所提到的线程都是独立的,而且异
步执行,也就是说每个线程都包含了运行时所
需要的数据或方法,而不需要外部的资源或方
法,也不必关心其它线程的状态或行为。
 但是经常有一些同时运行的线程需要共享数据
,此时就需考虑其他线程的状态和行为,否则
就不能保证程序的运行结果的正确性。

Object-Oriented Programme 29
Sample code
 Sample code (stack.java) 说明了此问题。
 两个线程 A 和 B 在同时使用 Stack 的同一个
实例对象, A 正在往堆栈里 push 一个数据,
B 则要从堆栈中 pop 一个数据。如果由于线程
A 和 B 在对 Stack 对象的操作上的不完整性,
会导致操作的失败,具体过程如下所示:
 1) 操作之前
 data =|p|q||||| idx=2
 2) A 执行 push 中的第一个语句,将 r 推入堆
栈;
 data =|p|q|r|||| idx=2
 3) A
还未执行 idx++ 语句, A 的执行被 B 中
断, B 执行 popObject-Oriented
方法,返回 Programme q : 30
2.1 互斥锁
 为解决操作的不完整性问题,在 Java 语言中
,引入了对象互斥锁的概念,来保证共享数据
操作的完整性。
 每个对象都对应于一个可称为“ 互斥锁” 的
标记,这个标记用来保证在任一时刻,只能有
一个线程访问该对象。
 关键字 synchronized 来与对象的互斥锁联系。
当某个对象用 synchronized 修饰时,表明该
对象在任一时刻只能由一个线程访问

Object-Oriented Programme 31
Sample code
  public void push(char c){
     synchronized(this){ //this 表示 Stack 的当前对象
      data[idx]=c;
      idx++;
     }
   }
   public char pop(){
     synchronized(this){ //this 表示 Stack 的当前对象
     idx--;
     return data[idx];
     }
   }

Object-Oriented Programme 32
Synchronized 类及方法声明
 synchronized 除了象上面讲的放在对象前面限制一段代码的
执行外,还可以放在方法声明中,表示整个方法为同步方法

   public synchronized void push(char c){
   …
   }
 如果 synchronized 用在类声明中,则表明该类中的所有方法
都是 synchronized 的。
   public synchronized class Stack{
m1();
m2();   

   }

Object-Oriented Programme 33
2.2 多线程的同步
 本节将介绍如何控制互相交互的线程之间的运
行进度 , 即多线程之间的同步问题 ,
 下面将通过多线程同步的模型 : 生产者 - 消费
者问题来说明怎样实现多线程的同步。
 系统中使用某类资源的线程称为消费者,产生
或释放同类资源的线程称为生产者。

Object-Oriented Programme 34
Sample code
 Sample code(SyncTest.java)
 生产者线程向文件中写数据,消费者从文件中读数
据,这样,在这个程序中同时运行的两个线程共享
同一个文件资源。通过这个例子我们来了解怎样使
它们同步。
 类 Producer 是生产者模型,其中的 run() 方法中定
义了生产者线程所做的操作,循环调用 push() 方法 ,
将生产的 20 个字母送入堆栈中,每次执行完 push
操作后,调用 sleep() 方法睡眠一段随机时间,以给
其他线程执行的机会。类 Consumer 是消费者模型
,循环调用 pop() 方法 , 从堆栈中取出一个数据,一
共取 20 次,每次执行完 pop 操作后,调用 sleep()
方法睡眠一段随机时间,以给其他线程执行的机会

Object-Oriented Programme 35
例子说明
 上例中,通过运用 wait() 和 notify() 方法来实现线程的同步,
在同步中还会用到 notifyAll() 方法
 一般来说,每个共享对象的互斥锁存在两个队列,一个是锁
等待队列,另一个是锁申请队列,锁申请队列中的第一个线
程可以对该共享对象进行操作,而锁等待队列中的线程在某
些情况下将移入到锁申请队列。
 下面比较一下 wait() 、 notify() 和 notifyAll() 方法:
 (1) wait,nofity,notifyAll 必须在已经持有锁的情况下执行 , 所以它们只
能出现在 synchronized 作用的范围内,也就是出现在用
synchronized 修饰的方法或类中。
 (2) wait 的作用 : 释放已持有的锁 , 进入等待队列 .
 (3) notify 的作用 : 唤醒 wait 队列中的第一个线程并把它移入锁申请队
列.
 (4) notifyAll 的作用 : 唤醒 wait 队列中的所有的线程并把它们移入锁申
请队列 .

Object-Oriented Programme 36
目前版本的 API 已经停止使用的方法
1) suspend() 和 resume()
在 JDK1.2 中不再使用 suspend() 和 resume(), 其
相应功能由 wait() 和 notify() 来实现。
2) stop()
在 JDK1.2 中不再使用 stop(), 而是通过标志位来
使程序正常执行完毕。
 Sample code (Xyz.java)

Object-Oriented Programme 37
3 Java Applet
 3.1 Applet 介绍
 3.2 Applet 的 AWT 绘制
 3.3 Applet 和浏览器间的通 信

Object-Oriented Programme 38
3 Java Applet
 到目前为止所介绍的全是 Java Application, 以下将介绍 java
的另一类应用 Java Applet, 即 Java 小应用程序。
 在 Java 问世的头几年里,之所以如此热门 , 其根本原因还是
在于 Java 具有“让 Internet 动起来”的能力。具体地说
 就是 Java 能创建一种特殊类型的程序
 具备 Java 能力的 Web 浏览器可从网上下载这种程序,然后运行。
 目前,几乎所有浏览器均支持动态 HTML ( DHTML )和脚
本编制(支持 XML 的浏览器也有很多),所以比起 Java 刚
刚问世的时候,浏览器能够做的事情要多得多。
 尽管如此,由于小应用程序是用一种全功能的程序设计语言
编制的,所以同 HTML 、 XML 和脚本语言的任何一种可能的
组合相比,它仍然具有应用前景!

Object-Oriented Programme 39
3.1 Applet 介绍 (1)
 Applet 就是使用 Java 语言编写的一段代码,
它可以在浏览器环境中运行。
 Applet 与 Application 的区别主要在于其执行
方式的不同。
 application 是从其中的 main() 方法开始运行的

 Applet 是在浏览器中运行的,
必须创建一个HTML 文件
告诉浏览器载入何种 Applet 以及如何运行
 在浏览器上的位置
 从何处下载
 applet 运行参数是什么 40
Object-Oriented Programme
运行 Applet
 Applet
程序编写完后,首先要用 java 编译器
编译成为字节码文件,然后编写相应的 HTML
文件才能够正常执行,
 例 : 为运行上面的 Applet 程序所编写的 HTML
文件 HelloWorld.html 如下 :
<HTML>
<APPLET CODE="HelloWorld.class" WIDTH=200
HEIGHT=100>
</APPLET>
</HTML>

Object-Oriented Programme 41
Applet 的 安全性
" 沙箱 " 机制: Java 虚拟机为 Applet 提供能够良好
运行的沙箱,一旦它们试图离开沙箱则会被禁止。
 由于小应用程序是通过网络传递的,这就带来一些
安全问题。
 如有人编写恶意程序通过小应用程序读取用户密码并散播
到网络上,这将会是一件非常可怕的事情。
 必须对小应用程序进行限制。
 浏览器禁止 Applet 执行下列操作 :
(1) 在运行时调用其它程序。
(2) 文件读写操作。
(3) 装载动态连接库和调用任何本地方法。
(4) 试图打开一个 socket 进行网络通信 , 但是所连接的主机
并不是提供 Applet 的主机。

Object-Oriented Programme 42
Java1.0 的沙箱机制
 Java
语言作为以种网络编程语言,具有很多
特点来满足网络编程的需求,
 最为人们所津津乐道的是
 它的遍写一次到处运行,
 以及它的安全性。

 它的安全性,从发明到现在已经为无数的事实
所证明。
 Java 语言的安全性,安全机制也有它发展的
过程,

Object-Oriented Programme 43
Java1.0 的沙箱机制

Object-Oriented Programme 44
Java1.0 的沙箱机制
 它最早是为在浏览器中运行的 Applet 所设计

 Applet 的运行代码是通过网络传输到用户的
机器中,为了防止恶意代码,该机制把用户应
用简单分为本地应用和网络应用 (applet) 。
 对网络应用它只能放一些安全的 APIs 从而
保证安全性。
 但该机制过于简单,无法很好满足开发者的需
求。

Object-Oriented Programme 45
Java1.1 的可信 任代码的安 全机制
 该机制在 Java1.0 沙箱机制的基础上,引入一种新的网络应
用,及可信任的网络应用,但并未对所访问的资源进行很好
的划分。
 应用要吗受沙箱的约束,只能访问有限资源,要么就能访问
所有资源。

Object-Oriented Programme 46
Java1.2/2 的域安全机制
 该安全机制通过配置文件对 Java 的应用以及访问的资源进行
配置,从而实现了一种非常细化的安全机制。

Object-Oriented Programme 47
Applet 的类层次

Object-Oriented Programme 48
Applet 的生命周期
 小应用程序的生命周期相对于 Application 而
言较为复杂。在其生命周期中涉及到 Applet
类的四个方法(也被 JApplet 类继承):
init() 、 start() 、 stop() 和 destroy() 。下面首
先用图来表示一个小应用程序的生命周期,然
后再简要描述这四个方法。

Object-Oriented Programme 49
Applet 的生命周期状态转换图

Object-Oriented Programme 50
Applet 的生命周期中的四个状态
 Applet 的生命周期中有四个状态:
 初始态
 运行态
 停止态
 消亡态

Object-Oriented Programme 51
四个状态变化过程
 当程序执行完 init() 方法以后, Applet 程序就进入了
初始态;
 然后马上执行 start() 方法, Applet 程序进入运行态

 当 Applet 程序所在的浏览器图标化或者是转入其它
页面时,该 Applet 程序马上执行 stop() 方法,
Applet 程序进入停止态;
 在停止态中,若浏览器又重新装载该 Applet 程序所
在的页面,或浏览器从图标中复原,则 Applet 程序
马上调用 start() 方法,进入运行态;
 当然,在停止态时,如果浏览器关闭,则 Applet 程
序调用 destroy() 方法,进入消亡态。 52
Object-Oriented Programme
Applet 的主要方法
 init( )  创建 Applet 时执行 , 只执行一次
 当小应用程序首次被支持 Java 的浏览器加载时,便执行该方法。
 在小应用程序的生命周期中,只执行一次该方法,因此可以在其中进
行一些只执行一次的初始化操作,如处理由浏览器传递进来的参数、
添加用户接口组件、加载图像和声音文件等。
 小应用程序有默认的构造方法,但它习惯于在 init() 方法中执行所有的
初始化,而不是在默认的构造方法内。
 start( )  当浏览器从图标恢复成窗口 , 或者是返回该页面时
执行;多次执行。
 系统在调用完 init() 方法之后,将自动调用 start() 方法。
 而且每当浏览器从图标恢复为窗口时,或者用户离开包含该小应用程
序的主页后又再返回时,系统都会再执行一遍 start() 方法。
 start() 方法在小应用程序的生命周期中被调用多次,以启动小应用程
序的执行,这一点与 init() 方法不同。
 该方法是小应用程序的主体,在其中可以执行一些需要重复执行的任
务或者重新激活一个线程,例如开始动画或播放声音等。
Object-Oriented Programme 53
Applet 的主要方法
 stop( )  当浏览器变成图标时 , 或者是离开主页时执行,主
要功能是停止一些耗用系统资源的工作 , 。多次执行 ,
 与 start() 相反,当用户离开小应用程序所在页面或浏览器变成图标时
,会自动调用 stop() 方法。
 因此,该方法在生命周期中也被多次调用。这样使得可以在用户并不
注意小应用程序的时候,停止一些耗用系统资源的工作(如中断一个
线程),以免影响系统的运行速度,且并不需要去人为地去调用该方
法。
 如果小应用程序中不含动画、声音等程序,通常也不必重载该方法。
 destroy( )   用来释放资源,在 stop( ) 之后执行
 浏览器正常关闭时, Java 自动调用这个方法。 destroy() 方法用于回
收任何一个与系统无关的内存资源。
 如果这个小应用程序仍然处于活动状态, Java 会在调用 destroy() 之
前,调用 stop() 方法。

Object-Oriented Programme 54
Sample code
 Sample
code( HWloop.java)
 例中使用了小应用程序生命周期中的这几个方

 在本例子中, Applet 开始执行后就不停的播
放声音,如果浏览器图标化或者是转到其它页
面,则声音停止播放;如果浏览器恢复正常或
者是从其它页面跳回,则程序继续播放声音。

Object-Oriented Programme 55
与 Applet 程序有关的 HTML 文件标记
 Applet 程序要嵌入到 HTML 文件中才能够正常执行。
  <applet>
   [archive=archiveList] // 同一个 codebase 中需
预先下载的文件
   code=appletFile.class //applet 的名称
   width=pixels height=pixels //applet 的初始显
示空间
   [codebase=codebaseURL] // 代码的地址
   [alt=alternateText] // 如果浏览器不支持 applet
时,显示的替代文本
   [name=appletInstanceName] // 给 applet 取名
,用于同页面 applet 之间的通信
   [align=alignment] // 对齐方式,如
left,right,top,baseline...
56
Object-Oriented Programme
   [vspace=pixels] [hspace=pixels] // 预留的边缘
3.2 Applet 的 AWT 绘制
 Applet
程序中所采用的 AWT 的绘图机制主要
涉及三个方法: paint() 方法、 update() 方法
和 repaint() 方法, update() 方法和 paint() 方
法都有一个 Graphics 类参数。 Graphics 是画
图的关键,它可以支持两种绘图:一种是基本
的绘图,如:画线、矩形、圆等;另一种是画
图象,主要用于动画制作

Object-Oriented Programme 57
Graphics 类
 绘图必须找到一个 Graphics 类的对象。
 update() 方法和 paint() 方法所传递的参数都是
Graphics 类的对象,
 主要是通过重载它们来进行绘图,
 这是在动画程序中经常使用的方法。

 还可通过 getGraphics() 方法得到一个 Graphics 类


的对象,
 这个对象和 update() 方法和 paint() 方法中所传递的
对象一样,都是该成员所对应的 Graphics 类的对象。
得到了 Graphics 类的对象,就可使用各种绘图方法。

Object-Oriented Programme 58
Graphics 中提供的图形绘制方法
 paint( )
 进行绘图的具体操作,必须由程序员重写

 update( )
 用于更新图形,先清除背景、前景,再调用 paint()
 repaint( )
 在组件外形发生变化,即大小改变或位置移动时,用于重
绘图形,
 repaint( ) 方法立即被系统自动调用,而实际上 repaint() 方
法是自动调用 update() 方法

   

Object-Oriented Programme 59
Graphics 中其它绘制方法
 下面的方法支持基本的绘图和画图像:
   void drawLine( )
   void drawArc( )
   void drawPolygon( )
   void drawRect( )
   void drawRoundRect( )
   void fill3DRect( )
   void fillOval( )   
 输出文字:
   void drawBytes( )
   void drawChars( )
   void drawString( )

Object-Oriented Programme 60
Applet 的 AWT 绘制实例
 Sample code (ArcTest.java)

Object-Oriented Programme 61
3.3 Applet 和浏览器间的通 信
在 Applet 类中提供了许多方法,使 Applet 可
以与浏览器进行通信。
 一个 Web 页可包含一个以上的小应用程序。
 一个 Web 页中的多个小应用程序可以直接通
过 java.applet 包中提供的方法进行通信。

Object-Oriented Programme 62
Applet 与服务器 / 浏览器通信
 getDocumentBase()
 返回当前网页所在的 URL
 getCodeBase()
 返回当前 applet 所在的 URL
 getImage(URL base,String target)
 返回网址 URL 中名为 target 的图像
 getAudioClip(URL base,String target)
 返回网址 URL 中名为 target 的声音对象
 getParameter(String target )
 提取 HTML 文件中名为 target 的参数的值
Object-Oriented Programme 63
同页 Applet 间的通信
在java.applet.Applet 类中提供了方法得到当前运行
页的环境上下文 AppletContext 对象。
public AppletContext getAppletContext();
 通过 AppletContext 对象,可以得到当前小应用程序
运行环境的信息。
 AppletContext 是一个接口,其中定义了一些方法可
以得到当前页的其它小应用程序,进而实现同页小
应用程序之间的通信。
 public AppletContext getAppletContext();
 得到当前运行页的环境上下文 AppletContext 对象
 public abstract Applet getApplet(String name)
 取得名为 name 的 Applet 对象
 public abstract Enumeration getApplets()
 得到当前页中所有 Applet 对象

Object-Oriented Programme 64
实例
 实际工程实例

Object-Oriented Programme 65

You might also like