Professional Documents
Culture Documents
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() 方法让当前线程暂停执行
然后由其它线程来争夺执行的机会。
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 类的对象,
主要是通过重载它们来进行绘图,
这是在动画程序中经常使用的方法。
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