Java程序设计教程 第九章
Java语言程序设计教程第九章
Java中的容器分为顶层容器、中间容器和特殊 容器三大类。其中,顶层容器是GUI的基础, 其它所有的组件都是直接或间接显示在顶层容 器中的。在Swing中有三种顶层容器,分别是 JFrame(框架窗口,即通常的窗口)、 JDialog(对话框)、JApplet(用于设计嵌入 在网页中的Java小程序)。 中间容器是可以 包含其它相应组件的容器,但是中间容器不能 单独存在,必须依附于顶层容器。Java常见的 中间容器有JPanel、JPanel、JScrollPane等 。还有一些特殊容器如JLayeredPane、 JRootPane 、JInternalFrame等。本书只列举 三个常用容器JFrame、JDialog和JPanel。
9.3 容器、组件和布局
在学习GUI的编程的时候,必须很好的掌握和理解容 器类(Container)和组件类(Component)。Component 类及其子类的对象用来描述以图形化的方式显示在屏 幕上并能够与用户进行交互的GUI元素。Container类 是用来组织界面上的组件或者单元。有两种常用的 Container(容器),一种是Window,Window对象表示 自由停靠的顶级窗口,另一个是Panel对象,可作为 容纳其他Component对象,但不能够独立存在,必须 被添加到其他Container中,比如说Window或者 Applet中。需要注意的是,Container是 ponent的子类,java.swing中的 JComponent类是java.awt中Container类的一个直接 子类,是java.awt中Component类的间接子类。Swing 中容器和组件的关系如图9.2所示。
1.JFrame Java中所提供的JFrame类的实例就是一个顶层容 器,是构造GUI的基础,其他的组件必须添加到顶层 容器中,以便和操作系统进行信息交互。JFrame的 常用方法见表9.1。
JAVA语言程序设计教程 第9章
在跨平台能力方面,SWT不如Swing优秀。但SWT具有可 以作为本地应用程序实现的优点,性能较高一些,并允许利用 基于SWT的GUI来实现本地兼容性。如果只为一种平台开发系 统,可以优先选用SWT。现在有一些成功的SWT案例,例如 开源集成开发环境Eclipse就是用Java和SWT开发的。
【例9-1】 创建窗体并设置窗体标题以及其他属性,然后 显示窗体。
import Javax.swing.*; public class HelloSwing {
public static void main(String[] args) { JFrame win = new JFrame(“HelloSwing的标题”); win.setSize(250,100); //设置窗口大小 win.setLocation(250,250);//设置窗口位置
综合来讲,Swing 具有内嵌于Java技术的优点,是完全 可移植的,无可争议,它是一种很好的架构。本章后面的章 节将对Swiget Toolkit(SWT),最初是由IBM开发的一 套用于Java的图形用户界面系统,现在由Eclipes基金会负责维 护,与Swing是竞争关系。
第 9 章 图形用户界面设计
9.1 AWT、Swing和SWT 9.2 一个简单例子 9.3 顶层容器 9.4 JFrame窗体 9.5 菜单 9.6 布局管理 9.7 常用组件 9.8 常用对话框 9.9 在Swing组件中使用HTML 9.10 事件处理 9.11 界面外观 9.12 并发编程与线程安全
Java语言程序设计第9章
在(x1,y1)与(x2,y2)两点之间绘制 一条线段
用指定的width和height绘制一个矩 形,该矩形的左上角坐标为(x,y) 用指定的width和height绘制一个实 心矩形,该矩形的左上角坐标为 (x,y)
}
HelloSwingApplet
import javax.swing.*;. import java.awt.*;
public class HelloSwingApplet extends JApplet { public void init() { JLabel label = new JLabel( "You are successfully running a Swing applet!"); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder( 1,1,2,2,Color.black)); getContentPane().add(label, BorderLayout.CENTER); } }
4
Applet应用程序接口(API)
ng.Object ponent java.awt.Container java.awt.Panel java.applet.Applet javax.swing.JApplet
5
方法 public void init()
9
图形环境和图形对象
坐标
– GUI组件的左上角坐标默认为(0,0) – 从左上角到右下角,水平坐标x和垂直坐标y增加。 – 坐标的单位是象素
Java语言程序设计(郑莉)第九章课后习题答案要点
Java语言程序设计第九章课后习题答案1.编写一个程序,该程序绘制一个5×9的网络,使用drawLine方法。
//NetWork类import java.awt.Graphics;import javax.swing.JFrame;public class NetWork extends JFrame{public NetWork(){// 设置窗体大小this.setSize(130, 130);//设置窗体大小不可改变this.setResizable(false);// 设置默认关闭方式,关闭窗体的同时结束程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 将窗体显示出来this.setVisible(true);}//横纵格之间都间隔10像素,起点在(20,40)public void paint(Graphics g){//绘制横向线for(int i=0;i<=5;i++){g.drawLine(20, 40+i*10, 110, 40+i*10);}//绘制纵向线for(int i=0;i<=9;i++){g.drawLine(20+i*10, 40, 20+i*10, 90);}}}//test9_1类public class test9_1 {public static void main(String[] args){new NetWork();}}运行结果:2.编写一个程序,该程序以不同的颜色随机产生三角形,每个三角形用不同的颜色进行填充。
//Triangle类import java.awt.Color;import java.awt.Graphics;import java.util.Random;import javax.swing.JFrame;public class Triangle extends JFrame{Random rnd = new Random();//这里定义4个三角形int[][] x=new int[4][3];int[][] y=new int[4][3];int[][] color=new int[4][3];public Triangle(){for(int i=0;i<4;i++){for(int j=0;j<3;j++){color[i][j]=rnd.nextInt(255);x[i][j]=rnd.nextInt(i*100+100);y[i][j]=rnd.nextInt(i*100+100)+50;//加50像素是为了避免顶到窗体上沿}}//窗体标题this.setTitle("随机三角形");//窗体大小this.setSize(500,500);//窗体大小不可变this.setResizable(false);//关闭窗体的同时结束程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//显示窗体this.setVisible(true);}public void paint(Graphics g){for(int i=0;i<4;i++){g.setColor(new Color(color[i][0],color[i][1],color[i][2]));g.fillPolygon(x[i], y[i], 3);}}}//test9_2public class test9_2 {public static void main(String[] args){new Triangle();}}运行结果:3.编写一个Applet,该程序请求用户输入圆的半径,然后显示该圆的直径、周长和面积。
9Java程序设计教程 第九章 网络编程
Java程序设计教程
Java程序设计教程
第 11 页
UDP协议和TCP协议简单对比
第九章
网络编程
TCP协议可靠,传输大小无限,但是需要连接建立时间,差 错控制开销大。UDP协议不可靠,差错控制开销较小,传输 大小限制在64KB以下,不需要建立连接,通信效率很高。
Java程序设计教程
Java
语 言 程 序 设 计
Java程序设计教程
第2 页
第九章 网络编程
Java程序设计教程
第3 页
学习目标
任务1:网络通信协议 任务2: TCP/IP协议 任务3: UDP协议
第九章
网络编程
(1) Java网络通信 (2) U程
Java程序设计教程
第4 页
网络通信协议
第九章
网络通信协议通常由三部分组成:
(1)一是语义部分,用于决定双方对话的类型; (2)二是语法部分,用于决定双方对话的格式; (3)三是变换规则,用于决定通信双方的应答关系。
网络编程
Java程序设计教程
Java程序设计教程
第5 页
TCP/IP协议
第九章
网络编程
TCP/IP协议是一种可靠的网络协议,它在通信的两端各建立 一个Socket,从而在通信的两端之间形成网络虚拟链路。一
集信息包,并将其按适当的次序放好传送,接收端收到后再 将其正确地还原。
Java程序设计教程
Java程序设计教程
第8 页
TCP/IP协议
第九章
网络编程
TCP协议保证了信息包在传送过程中准确无误。TCP协议使用 重发机制,当一个通信实体发送一个消息给另一个通信实体 后,需要收到另一个通信实体的确认信息,若没有收到另一 个通信实体的确认信息,则会再次重发刚才发送的信息。
面向对象Java程序设计 第9章
第9章常用组件GUI设计9.1 Swing概述9.2 事件响应原理9.3 JLable组件9.4 JButton组件与JToggleButton组件9.5 JCheckBox和JRadioButton组件9.6 JComboBox组件9.7 JList组件9.8 JTextField与JTextArea组件9.1 Swing 概述图9.1 图形用户界面中常用的组件9.1.1 JApplet由于所有的Swing GUI组件都应该包含在JApplet小程序中,且javax.Swing.JApplet是java.applet.Applet的子类,所以本章主要介绍javax.Swing的“J组件”,应用程序均以JApplet小程序为例。
JApplet的使用与Applet小程序相似,它们与HTML文件的配合没有什么差别,差别仅在默认布局策略与个别方法的使用上,这将在讲述到有关内容时加以讨论。
9.1.2 Swing中常用的包由于Swing功能相当强大且复杂,考虑到功能分解的原则,Java系统将Swing按不同功能分为表9.1所示的若干个包,它们分别针对于不同的组件及事件。
表9.1 Swing中常用的包包名说明javax.swing最常用的包,包含了各种Swing组件的类javax.swing.border包含与Swing组件外框有关的类javax.swing.colorchooser针对Swing调色版组件(JColorChooser)设计的类javax.swing.event处理由Swing组件产生的事件javax.swing.filechooser包含针对Swing文件选择对话框(JFileChooser)所设计的类javax.swing.plaf处理Swing组件外观的相关类表9.1 Swing中常用的包javax.swing.table针对Swing组件表格(JTable)所设计的类javax.swing.textjavax.swing.text.html包含与Swing文字组件相关的类javax.swing.text.html.parserjavax.swing.text.rtfjavax.swing.tree针对Swing树状元素(JTree)所设计的类javax.swing.undo提供Swing文字组件的Redo与Undo功能9.1.3 常用组件的继承关系由于本章所述组件所使用的成员方法主要是继承其直接父类或更高层父类的成员方法,为了正确地使用这些组件,有必要了解每个组件的继承关系。
Java程序设计实用教程_第9章_java applet程序
相应的HTML文件的内容为: <applet code= Example9_3.class width=200 height=200> <Param name="girl" value ="160"> <Param name="boy" value ="175"> </applet>
17
9.4 在Applet中使用图形、字体和颜色 9.4.1 使用图形:Graphics类 Graphics类中常用的两种属性:Color和Font Graphics类的常用方法
13
public void start() { sum=0; for(int i=1;i<=90;i++) sum=sum+i; } public void paint(Graphics g) { g.setColor(Color.blue); g.drawString("程序设计方法",20,60); g.setColor(Color.red); g.drawString("sum="+sum,20,90); } }
第9章 Applet程序
1
9.1 Applet简介
9.1.1 Applet说明 1. 查看方法: •支持Java的Web浏览器 •appletviewer 2. 显示Applet •Applet是一种特殊的Java程序,它不能独立运行。编 译器将Applet源程序编译成Java字节码(Byte-Code) 后,在网页中加载的是Java字节码。在网络上如果查 看包含Java字节码的网页,则Web服务器将编译好的 Java字节码送至客户端的浏览器中执行,
Java程序设计电子教案第九章
上一页 下一页 返回
9.1图形处理 图形处理
// TestColor.Java import java.applet.Applet; import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class TestColor extends Applet { public void paint( Graphics g ) {
上一页 下一页 返回
9.1图形处理 图形处理
根据题目的要求, 根据题目的要求,我们使用一组随机数来指定直线两个端点 的坐标,并采用循环结构实现10次循环 次循环。 的坐标,并采用循环结构实现 次循环。drawLine方法 方法 中的4个整型参数代表直线两个端点的坐标 个整型参数代表直线两个端点的坐标。 中的 个整型参数代表直线两个端点的坐标。random()是 是 Math类中的一个方法,该方法返回一个 类中的一个方法, 类中的一个方法 该方法返回一个double值,值域为 值 类是java.1ang包的一部分 (0.0,1.0)。Math类是 . , . 。 类是 . 包的一部分 java.1ang可由编译器自动引入,所以我们不必把 可由编译器自动引入, . 可由编译器自动引入 所以我们不必把Math 类引入到程序中。直接调用random方法得到返回值太小, 方法得到返回值太小, 类引入到程序中。直接调用 方法得到返回值太小 在实际应用中往往乘以一个整数因子, 在实际应用中往往乘以一个整数因子,并强制类型转换 为 一个合适的整数。 一个合适的整数。如(int)(Math.random()x100)的 . 的 实际取值范围为[0, 实际取值范围为 ,100]。在图形方式下要想准确定位, 。在图形方式下要想准确定位, 必须了解屏幕坐标系的构成。 必须了解屏幕坐标系的构成。Java定义一个窗口工作区的左 定义一个窗口工作区的左 上角为坐标原点(o, ,以像素点为单位, 上角为坐标原点 ,o),以像素点为单位,顺序向右和向下 延伸。图形的大小如超过窗口,则超出部分不会显示出来。 延伸。图形的大小如超过窗口,则超出部分不会显示出来。
Java语言程序设计课件-第九章
第九章Java Applet主要内容:Java Applet和Java Application的区别及Java Applet的应用9.1 Java Applet和Java Application (1)Application是独立运行的,Applet是嵌入到Web页面上的,必须在支持Java的浏览器中运行,例如,Netscape Navigator,Microsoft IE,Sun HotJava等。
(2)Application必定含有一个,并且只有一个方法main()。
Applet无方法main(),并从java.applet.Applet 继承。
(3)Application是能进行各种操作的程序,包括读/写文件操作。
但Applet 对站点的磁盘文件既不能进行读操作,也不能进行写操作。
9.2 Java Applet的生命周期1.Java Applet从建立到执行可分为四步:(1) 用Java语言编写一个Applet源程序。
(2) 把Applet源程序编译成字节码。
(3) 将字节码嵌入Web页面。
即写一个含Applet的HTML文件。
(4) 用支持Java的浏览器运行、浏览。
2.Applet的生命周期即,Java Applet的执行过程,它涉及的基本方法如下:(1)初始化 init()为Applet运行建立初始化环境,在整个Applet生命周期中,只执行一次方法init()。
(2) 启动 start()Applet被初始化后,系统会自动调用方法start()。
当进入或返回Applet所在的Web页面时,均需多次执行方法start()。
(3) 停止 stop()当浏览器离开Applet所在的Web页面转到其它页面时,Applet被停止。
(4) 删除 destory()当浏览器结束浏览时,执行方法destory(),释放Applet占用的资源。
在执行方法destory()前,先执行方法stop()。
《Java语言程序设计》(第3版)第9章
第9章网络通信【1】java提供了哪几种网络通信模式?[解答]:基于TCP/IP协议的面向连接的通信模式,基于UDP协议的面向无连接的通信模式。
【2】java的套接字网络通信方式分为哪几种?[解答]:基于TCP/IP协议:客户端套接字,服务器端套接字。
基于UDP协议:用户数据报套接字,广播数据报套接字。
【3】什么是socket,怎样建立socket连接?建立连接时,客户端和服务器端有什么不同?[解答]:Socket就是套接字,是IP地址和端口号的组合。
当两个网络程序需要通信时,它们可以通过使用Socket类建立套接字连接。
服务器端建立Socket以后,要执行一个等待的方法,以方便客户端来连接。
客户端建立Socket以后即与服务器端进行连接,成功握手以后,双方产生同样的Socket对象。
【4】请列举常用的协议及其端口号。
[解答]:ftp 21/tcptelnet 23/tcpsmtp 25/tcphttp 80/tcppop3 110/tcpsnmp 161/udphttps 443/tcphttps 443/udppop3 110/tcp【5】试描述用Socket建立连接的基本程序框架。
[解答]:(1)客户端建立套接字对象,指定服务器IP和端口号。
(2)服务器端建立套接字,并指定端口号。
(3)服务器端监听本机的端口的状态:执行accept()方法。
(4)客户端程序在对象产生以后以及,服务器端的程序监听到有连接以后都会产生一个Socket类的实例。
(5)对这两个实例中对应的输入流和输出流进行操作,即完成通信过程。
【6】说明客户端如何与服务器端进行连接。
[解答]:TCP/IP的方式是:客户端产生Socket对象的同时产生与对应端口号的服务器连接的动作。
UDP数据报的方式是:客户端建立DatagramSocket对象,建立报文DatagramPacket对象,并指定发送的IP地址,调用socket对象的send方法进行连接并发送数据。
《Java程序设计案例教程》第09章
public static void main(String[] args) {
❖
//读取E 盘test.txt 中的内容,显示输出
❖
FileInputStream in = null;
❖
int b;
❖
try {
❖
in = new FileInputStream("E:/test.txt");
❖
while ((b = in.read()) != -1) {
▪ 对于这两个read()方法,如果读取文件时发生错误,则会抛出IOException的异常。
Java程序设计案例教程
幻灯片 8,共38页
8
FileOutputStream类
❖ (1)FileOutputStream类的构造方法 ▪ 创建一个指向file文件中写入字节数据的FileOutputStream对象 • public FileOutputStream(File file) throws FileNotFoundException ▪ 创建一个指向File文件中写入字节数据的FileOutputStream对象,且如果第2个参数为true,则将字节数据追加到 文件末尾处,否则将字节数据写入文件开始处覆盖原有的文件 • public FileOutputStream(File file,boolean append) throws FileNotFoundException ▪ 创建一个向具体指定名称为name的文件中写入字节数据的FileOutputStream对象 • public FileOutputStream(String name) throws FileNotFoundException ▪ 创建一个向具体指定名称为name的文件中写入字节数据的FileOutputStream对象,且如果第2个参数为true,则 将字节数据追加到文件末尾处,否则将字节数据写入文件开始处覆盖原有的文件 • public FileOutputStream(String name,boolean append) throws FileNotFoundException
《Java程序设计案例教程》第九章练习答案
第9章继承与派生课后习题参考答案一、单项选择题1.下列有关派生类的叙述中,错误的是(D)。
A.一个派生类至少有一个基类B.派生类的默认继承方式是privateC.一个派生类可以作为另一个派生类的基类D.派生类只继承了基类的公有成员和保护成员2.下列有关类继承的叙述中,错误的是(B)。
A.继承可以实现软件复用B.派生类没有继承基类的私有成员C.虚基类可以解决由多继承产生的二义性问题D.派生类构造函数要负责调用基类的构造函数3.有如下类定义:class XX{int xdata;public:XX(int n=0):xdata(n){}};class YY:public XX{int ydata;public:YY( int m=0,int n=0):XX(m),ydata(n){}};YY类的对象包含的数据成员的个数为(B)。
A.1B.2C.3D.44.设类的定义如下,且int型数据在内存中用4个字节存储,则类B 的对象占据内存空间的字节数为(C)。
class A{int b;protected:int a;};class B:public A{{int c;public:int getC(){return c;}};A.4B.8C.12D.165.如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问权限分别是(D)。
A.private和publicB.private和protectedC.protected和publicD.protected和protected6.可以用p.a的形式访问派生类对象p的基类成员a,则a是(D)。
A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员7.设有如下类定义:class Base {protected:void fun(){}//…};class Derived:Base{//…};则Base类中的成员函数fun(),在Derived类中的访问权限是(C)。
Java语言程序设计_基础篇_中文ppt_第九章
获取字符串长度和在一个字符串中获取某个单个字符。 字符串连接(concat) 子串(substring(index)、substring(start, end)) 比较(equals、compareTo) 字符串转换 在一个字符串中找出一个字符或一个子串 字符串和数组之间的转换 将字符和数值转换成字符串
第9章 字符串和文本I/O
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807
1
动因
我们经常会遇到涉及字符串处理和文件输入/输 出的问题。假设你需要编写一个程序,该程序 用一个新字替换文件中所有出现的某个字。你 该如何实现这个功能呢?本章介绍字符串和文 本文件,它们可以解决此类问题。
Contents cannot be changed
: String
String object for "HTML"
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807
5
字符串是不可变的
String对象是不可变的;它的内容是不能改变的。 下列代码会改变字符串的内容吗? String s = "Java"; s = "HTML";
JAVA语言程序设计第九章
Applet中的事件处理 中的事件处理
提倡使用监听器方法。 提倡使用监听器方法。
22
Applet重要成员方法——HTML标志方法 重要成员方法 标志方法
URL getDocumentBase( ) 返回一个URL对象,描述包含 对象, 标记的HTML 返回一个 对象 描述包含applet 标记的 文件的目录。 文件的目录。 URL getCodeBase( ) 返回描述applet主类文件所在目录的 主类文件所在目录的URL对象。 对象。 返回描述 主类文件所在目录的 对象 String getParameter(String name) 返回定义在HTML文件中的 文件中的标志中指定 返回定义在 文件中的 标志中指定 参数的值。 参数的值。
本文由gxc530528贡献
ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
第九章 Applet
Applet 基本概念 编写Applet 编写 页中包含Applet 在HTML页中包含 页中包含 Applet中的事件处理 中的事件处理 Applet的重要成员方法 的重要成员方法
重新加载 Applet 退出浏览器
停止运行并释放所有资源。 停止运行并释放所有资源。 停止运行并释放所有资源
9
关键Applet方法 关键Applet方法 Applet
public class Simple extends Applet { …… public void init() { . . . } public void start() { . . . } public void stop() { . . . } public void destroy() { . . . } …… }
JAVA语言程序设计第九章
第9章 Applet基础与高级编程
9.1.6Applet的显示 的显示
Applet本质上是图形方式。 本质上是图形方式。 本质上是图形方式 每次刷新其显示时, 方法。 当Applet每次刷新其显示时,浏览器都调用 每次刷新其显示时 浏览器都调用paint( )方法。 方法 paint()把java.awt.Graphics类的实例作为参数。该实例 ()把 类的实例作为参数。 () 类的实例作为参数 包含了Applet所在 所在Panel的图形上下文信息。 的图形上下文信息。 包含了 所在 的图形上下文信息
第9章 Applet基础与高级编程
9.1.2 Applet的生命周期 的生命周期
Init Start 重新装入 Stop Destroy
装载Appl程
Applet的生命周期 的生命周期
Applet生命周期是指从 生命周期是指从Applet下载到浏览器开始,到 下载到浏览器开始, 生命周期是指从 下载到浏览器开始 用户退出浏览器终止Applet运行的过程。 运行的过程。 用户退出浏览器终止 运行的过程
第9章 Applet基础与高级编程
管理Applet环境的方法 环境的方法 管理
AppletContext getAppletContext()
Applet信息报告方法 信息报告方法
void ShowStatus(String status) String getAppletInfo() String[][] getParameterInfo()
第9章 Applet基础与高级编程
9.2.1 编写Applet的过程 编写 的过程
引入所需的Java API包; 引入所需的 包 定义Applet的主类,该类是Applet类的子类; 的主类,该类是 类的子类; 定义 的主类 类的子类 实现Applet的某些方法; 的某些方法; 实现 的某些方法 嵌入在HTML页面中运行; 页面中运行; 将Applet嵌入在 嵌入在 页面中运行
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.1.2ava中,每个线程从创建到消亡为一个生 Java中,每个线程从创建到消亡为一个生 存周期,它将经历四个状态: (1)新建状态(New Thread Status )新建状态(New (2)可执行状态(Runnable) )可执行状态(Runnable) (3)阻塞状态(Blocked) )阻塞状态(Blocked) (4)消亡状态(Dead thread) )消亡状态(Dead thread)
9.1.2 线程的控制
4. 终止一个线程 在程序中不能任意终止一个线程,否则可能 造成严重的线程安全问题.一个线程的终止 必须靠run()方法的正常返回.当一个线程从 必须靠run()方法的正常返回.当一个线程从 run()方法返回后,它就进入消亡状态,再也 run()方法返回后,它就进入消亡状态,再也 不能被运行了.结束run()方法还有另一种途 不能被运行了.结束run()方法还有另一种途 径,那就是在run()方法中抛出了异常,如果 径,那就是在run()方法中抛出了异常,如果 这些异常没有被捕获,JVM将会终止该线程. 这些异常没有被捕获,JVM将会终止该线程.
9.1.1 线程的概念
与程序的顺序执行相对的是程序的并发执行, 即一组逻辑上互相独立的程序或程序段在执 行过程中,其执行时间在客观上互相重叠. 程序的并发执行可以分成两种情况:一种是 多道程序系统中多道程序的并发执行,此种 情况下实际上是宏观上(程序级)同时进行, 微观上(指令级)顺序执行的;另一种是在 某道程序段的几个程序片段中,包含着一部 分可以同时执行或顺序颠倒执行的代码.程 序的并发执行是实现多线程技术的基础.
9.1.1 线程的概念
线程与进程类似,是一段完成特定功能的代 码.它是程序中单个顺序的控制流,也是一 个进程内的基本调度单位.线程和进程一样 拥有独立的执行控制,并由操作系统负责调 度.同一进程可以包含多个线程,这些线程 共享属于该进程的一块内存空间和一组系统 资源;而线程自身的数据通常只有微处理器 的寄存器数据,以及一个供程序执行时使用 的堆栈.系统在产生一个线程,或者在各个 线程之间切换时,负担要比进程小得多.此 外,由于线程只是在单个进程的作用域内活 动,所以线程间的通信也比进程简单.线程 的实现要依靠操作系统,现代操作系统一般 都支持线程技术.
9.1.2 线程的控制
5. 线程其他状态检测与切换 ng.Thread提供了用于线程控制的方 ng.Thread提供了用于线程控制的方 法,除上面介绍的之外,还有其他一些方法, 例如: public boolean isActive():用于检测线程是 isActive():用于检测线程是 否活动,当线程处于新建或消亡状态时返回 false,其他状态返回true. false,其他状态返回true. public void interrupt():设置线程的中断标 interrupt():设置线程的中断标 志,如果线程处于可运行状态,则只是简单 的设置中断标志,并不影响线程的运行;如 果该线程处于阻塞(休眠)状态,则将导致 sleep()方法抛出InterruptedException异常. sleep()方法抛出InterruptedException异常.
9.1.2 线程的控制
在可运行状态下,线程执行的核心代码就是 run()方法,或者是它直接或间接调用的方法. run()方法,或者是它直接或间接调用的方法. 在执行run()方法的过程中,线程既可能因调 在执行run()方法的过程中,线程既可能因调 用了sleep()方法而进入阻塞状态,也可能因 用了sleep()方法而进入阻塞状态,也可能因 等待I/O操作的完成而进入阻塞状态,还可 等待I/O操作的完成而进入阻塞状态,还可 能因调用了wait()方法以等待某一特殊情况 能因调用了wait()方法以等待某一特殊情况 出现而进入阻塞状态.一旦上述方法所要求 或等待的条件不再成立,则线程将重新进入 可运行状态,之后将被重新调度并继续执行 run()中的代码. run()中的代码.
9.1.2 线程的控制
6. 线程的同步 在编写多线程程序时,不可避免地会遇到多 个线程并发访问一个对象或者数据的情况, 此时就要十分小心的处理好线程之间的同步 问题.处理不好线程同步将可能导致线程读 到失效的数据,甚至引发死锁问题. 1)没有同步可能带来的问题 为了演示并发访问同一对象时没有进行同步 所带来的问题,请先看看下面的程序:
9.1.2 线程的控制
3. 可运行状态与阻塞状态的相互转化 一旦线程进入可运行状态,则线程将可以被 CPU调度执行.在系统中有一个负责线程调 CPU调度执行.在系统中有一个负责线程调 度与切换的调度器,它会在适当的时候选择 处于可运行状态线程到CPU上运行,至于怎 处于可运行状态线程到CPU上运行,至于怎 样调度以及选择哪个线程以供CPU执行,则 样调度以及选择哪个线程以供CPU执行,则 与操作系统和线程的优先级有关.在抢占式 操作系统中,当有优先级比当前正在执行的 线程优先级高的可运行线程出现时,将会调 度优先级高的线程到CPU上运行.然而,在 度优先级高的线程到CPU上运行.然而,在 非抢占式(或称分时)操作系统中,CPU的 非抢占式(或称分时)操作系统中,CPU的 执行时间被分成很小的时间片,分别分配给 各个线程执行.
9.1.1 线程的概念
3. 多线程编程
多线程编程是指将程序任务分成几个并行的子任 务,由这些子任务并发执行,一起协作完成程序 的功能.多线程的执行是并发的,即在逻辑上是 "同时"的,而不管是否是物理上的"同时". 如果系统只有一个CPU,那么真正的"同时"是不 如果系统只有一个CPU,那么真正的"同时"是不 可能的,而只能采用各线程轮流使用CPU的方法来 可能的,而只能采用各线程轮流使用CPU的方法来 模拟"同时执行"(只是由于CPU的速度非常快, 模拟"同时执行"(只是由于CPU的速度非常快, 用户感觉不到其中的区别);但是如果是在多CPU 用户感觉不到其中的区别);但是如果是在多CPU 系统中,则多线程的并行执行是可能的,可以把 不同的线程分配到不同CPU上同时执行. 不同的线程分配到不同CPU上同时执行.
9.1.2 线程的控制
【例程9-2】SynDemo.java 例程9 /*演示没有进行线程同步所带来的问题*/ /*演示没有进行线程同步所带来的问题* public class SynDemo{ public static void main(String[] args){ Demostrator shareDemostrator = new Demostrator(); Thread t1 = new Thread(shareDemostrator,"t1"); Thread t2 = new Thread(shareDemostrator,"t2"); t1.start(); t2.start(); } } class Demostrator implements Runnable{ private int shareData = 0; public void run(){
Java程序设计教程 Java程序设计教程
第9章 多线程与Applet 多线程与Applet
9.1 线程 HTML基础 9.2 HTML基础 9.3 Applet
9.1 线程
9.1.1 9.1.2 9.1.3 9.1.4 线程的概念 线程的控制 线程的创建 线程间通信
9.1.1 线程的概念
1. 程序的顺序执行与并发执行 程序的顺序执行是指一个具有独立功能的程 序独占处理机直至最终结束的过程.当程序 顺序执行时,在任意时刻程序中只有一个执 行点,它具有如下的特点: 顺序性:即程序执行过程可以看成是一系列 顺序性:即程序执行过程可以看成是一系列 严格按程序规定的状态转移的过程; 封闭性:也就是说程序执行的最终结果由给 封闭性:也就是说程序执行的最终结果由给 定的初始条件决定,不受外界因素的影响; 可再现性:只要输入的初始条件相同,则无 可再现性:只要输入的初始条件相同,则无 论何时重复执行该程序都会得到相同结果.
9.1.1 线程的概念
4. Java中线程的概念模型 Java中线程的概念模型 Java内在支持多线程,它的大部分类型都是 Java内在支持多线程,它的大部分类型都是 在多线程下定义的,从而使整个系统成为异 步系统.Java通过ng.Thread类封装了 步系统.Java通过ng.Thread类封装了 线程及其上的操作,每个线程由三部分组成: (1)虚拟的CPU,封装在ng.Thread )虚拟的CPU,封装在ng.Thread 类中. (2)CPU所执行的代码. CPU所执行的代码. (3)CPU所处理的数据. CPU所处理的数据.
9.1.2 线程的控制
线程的状态及其切换的示意图如图9 线程的状态及其切换的示意图如图9-2所示.
9.1.2 线程的控制
2. start()方法 start()方法 start()方法的作用是启动线程,使线程由新 start()方法的作用是启动线程,使线程由新 建状态进入可运行状态,准备被CPU调度执 建状态进入可运行状态,准备被CPU调度执 行.对于start()的调用是立即返回的,并不 行.对于start()的调用是立即返回的,并不 影响调用了start()方法的其他线程的执行. 影响调用了start()方法的其他线程的执行. 如果一个线程的start()方法没有被调用,则 如果一个线程的start()方法没有被调用,则 该线程是不可能运行的,而只能等待,因为 此时该线程没有分配到系统资源.
9.1.2 线程的控制
在Thread中定义的方法: Thread中定义的方法: public static void sleep(long milliseconds) throws InterruptedException //让线程休眠milliseconds微秒的时间 //让线程休眠milliseconds微秒的时间 public static void sleep(long milliseconds,int nanos) throws InterruptedException //让线程休眠milliseconds微秒加上nanos纳秒的时间 //让线程休眠milliseconds微秒加上nanos纳秒的时间 在Object中定义的方法: Object中定义的方法: public final void wait(long timeout) throws InterruptedException public final void wait(long timeout,int nanos) throws InterruptedException public final void wait() throws InterruptedException