目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第19章 创建线程程序

本章介绍如下内容:

在程序中使用接口;

创建线程;

启动、终止和暂停线程;

捕获错误。

一个常用于描述每天紧张忙碌的生活节奏的计算机术语是“多任务”,意思是同时做多件事,如一边浏览Web站点,一边参加电话会议,同时还做压腿练习。多线程计算机是同时可以运行多个程序的计算机。

Java 语句的一个复杂特性是,能够使用线程编写具有多任务功能的程序,Java 的该功能是通过称为线程的对象类实现的。

19.1 线程

在Java程序中,计算机同时处理的每一个任务称为“线程”,所有的任务称为“多线程”。线程在动画和很多其他程序中很有用。

线程是一种组织程序的方式,使其能够同时做多项工作。需要同时执行的每项任务都运行在自己的线程中,这通常是通过将每项任务作为独立的类来实现的。

线程用Thread类和Runnable接口表示,它们都位于java.lang包中。由于它们都位于这个包中,因此在程序不用使用import语句就能使用它们。

Thread类的一种最简单的用途是降低程序完成工作的速度。

19.1.1 降低程序的速度

Thread 类有一个 sleep( )方法,可在任何程序中调用它让程序停止运行一段时间。在动画程序中经常使用这种技术,以防止图像显示的速度超过Java解释器的处理能力。

要使用 sleep( )方法,可调用 Thread.sleep( )方法并使用要暂停的毫秒数作参数,如下面的语句所示:

上述语句让Java解释器暂停5秒再继续运行。如果由于某种原因解释器不能停止那么长时间,sleep( )方法将抛出 InterruptedException 异常。

由于可能会抛出上面提到的异常,因此,在使用 sleep( )方法时必须采取某种方式处理这种异常。一种解决办法是将 Thread.sleep( )语句放在 try-catch 块中:

要让Java程序同时处理多项任务,必须将程序组织成线程。根据需要,程序可以有任意多个线程,它们将同时运行,而且不会相互影响。

19.1.2 创建线程

可作为线程运行的 Java 类常被称为“线程化类”。虽然使用线程可让程序暂停几秒再执行,但通常因为相反的原因而使用它们:提高程序的运行速度。如果将耗时的任务放在独立的线程中,程序的其他部分运行起来将更快,这通常用于防止任务降低程序的图形用户界面的响应速度。

例如,如果编写了一个应用程序,它从磁盘加载股价数据并生成统计数据,则最耗时的任务是从磁盘加载数据。如果不在应用程序中使用线程,加载数据时程序的界面响应将很慢。这可能让用户失去耐心。

有两种方法可将任务放在线程中:

将任务放在实现了Runnable接口的类中;

将任务放在Thread的子类中。

要支持Runnable接口,可在创建类时使用关键字implements,如下例所示:

当类实现了接口后,除了自己的方法外,它还将支持其他的行为。

实现了 Runnable 接口的类必须包含 run( )方法,该方法的结构如下:

run( )方法应完成线程要完成的任务。在股票分析示例中,run( )方法应包含从磁盘加载数据以及根据这些数据生成统计信息的语句。

当线程应用程序运行时,不会自动执行 run( )方法中的语句。在 Java 中可以启动和终止线程,要运行线程,必须做下面两项工作:

通过调用构造函数Thread创建线程化类的对象;

通过调用 start( )方法启动线程。

构造函数 Thread 接受一个参数——包含线程的 run( )方法的对象。通常使用 this 作为参数,this 表明当前类包含 run( )方法。

程序清单 19.1 所示的 Java 应用程序在文本区域显示一系列素数。创建一个名为 Prime Finder的Java空文件,然后输入程序清单19.1中的所有文本,并保存。

程序清单 19.1 PrimeFinder.java 程序的源代码

应用程序PrimeFinder显示一个文本框、一个Display primes按钮和一个文本区域,如图19.1所示。

图19.1 运行 PrimeFinder应用程序

该应用程序中的大部分语句用于创建图形用户界面和显示一系列素数。下面是该程序中用于实现线程的语句。

第5行:将Runnable接口应用到PrimeFinder类。

第6行:创建一个Thread对象变量,名字为go,但是没有为其赋值。

第41~44行:如果对象变量go的值为null,表示该线程还没有创建,因此创建一个新的 Thread 对象并将其存储到 go 变量中。通过调用线程的 start( )方法启动线程,这导致 PrimeFinder类中的 run( )方法被调用。

图19.2 运行应用程序FindPrimes

第 47~60 行:run( )方法从 2 开始寻找一系列素数,并通过调用文本区域组件 primes的 append( )方法显示每个素数。素数个数由 howMany 文本框中的值决定。

19.2 使用线程

可以通过调用start( )方法启动线程,因此读者可能认为也有一个stop( )方法用于终止线程。

尽管在 Java 的 Thread 类中包含 stop( )方法,但不提倡使用该方法。在 Java 中,不提倡使用的元素是指已被更好的东西取代的类、接口、方法或变量。

警告:

读者应该重视有关不提倡使用的警告。Oracle 公司不提倡使用 stop( )方法,因为它可能给 Java 解释器中运行的其他线程带来问题。线程类的resume( )方法和 suspend( )方法也不提倡使用。

下一个项目将演示如何终止线程。读者将编写的程序将在一个列表中循环,该列表包含网站名称及其网址。

每一个页面的标题和地址将循环显示。用户可以单击applet窗口中的按钮来访问当前显示的网站。该程序按顺序显示每个网站的信息。由于时间因素,使用线程来控制程序是最好的选择。

这次不是首先在NetBeans的源代码编辑器中输入程序然后再介绍它。本章结束时读者将有机会输入 LinkRotator applet 的全部代码,在此之前,将描述该程序的每个组成部分。

19.2.1 声明类

在这个applet中,首先需要使用import语句导入java.awt、java.net、java.applet、java.awt. event和javax.swing中的一些类。

使用import语句导入一些类后,就可以使用下面的语句创建applet:

该语句将 LinkRotator 类声明为 JApplet 的子类,并指出它支持两个接口:Runnable 和ActionListener。通过实现 Runnable 接口,将能够在该 applet 中使用 run( )方法来启动线程;ActionListener接口让该applet能够响应用户使用鼠标执行的操作。

19.2.2 创建变量

在LinkRotator类中,首先要创建该类的变量和对象。创建两个包含6个元素的数组:一个名为pageTitle的String对象数组和一个名为pageLink的URL对象数组:

pageTitle数组用于存储要显示的6个网站的标题。URL对象存储网站地址,URL有记录网站地址以及在Web浏览器中根据地址加载网页所需的行为和属性。

最后3项工作是创建一个名为butterscotch的Color对象、一个名为current整型变量和一个名为runner的Thread对象:

Color对象表示在用于字体、用户界面组件和其他Swing可视对象的颜色,第23章将介绍如何使用Color对象。

变量 current 用于记录当前显示的网址,以便能够在网站之间循环。Thread 对象 runner是该程序运行的线程。可调用runner对象的方法来启动、终止和暂停applet的运行。

19.3 从init( )开始

applet 第一次运行时,将自动调用 applet的 init( )方法。该方法用于给 applet 的两个数组赋值:pageTitle和pageLink。在这里还将创建一个显示在applet窗口中的可单击按钮。该方法由下面的语句组成:

每一个网站的标题存储到 pageTitle 数组的 6 个元素中,这是用 6 个字符串来实现的。PageLink 数组的元素由 getURL( )方法返回的值来确定,getURL( )方法此时还没有创建。

init( )方法中的最后 7 条语句用于创建一个按钮并将其放在 applet 窗口中。该按钮的标签为文本Go。

19.4 在创建URL时捕获错误

创建URL对象时,必须确保用于设置网址的文本为有效格式。http://workbench.cadenhead. org和http://www.samspublishing.com都是有效的,但是http:www.javaworld.com不是有效的,因为少了//。

getURL(String)方法接受一个网络地址作为参数,然后返回一个表示该地址的URL对象。如果作为参数的字符串不是有效的地址,则返回null。

在创建URL对象时,try-catch语句块用来处理发生的任何MalformedURLException错误。由于在该错误抛出时,什么都没有发生,因此catch语句块只包含注释行。

19.5 在paint( )方法中处理屏幕更新

当applet窗口需要更新时,将执行applet的paint( )方法。可以在applet内手动调用paint( )方法。

调用 repaint( )方法可以强制调用 paint( )方法。该方法告诉图形用户界面有变动发生,有必要显示更新。

LinkRotator applet的 paint( )方法如下:

该方法中的第一条语句创建一个Graphics2D对象,它表示applet窗口的可绘制区域。所有绘制操作都将通过调用该对象的方法来完成。

Graphics2D的 setColor( )方法用于选择随后的绘制操作使用的颜色。绘制填充整个 applet窗口的矩形前,将颜色设置为奶油糖色。接下来将颜色设置为黑色,并在屏幕的(5, 60)和(5, 80)处分别显示一行文本。第一行是pageTitle数组的一个元素,第二行是URL对象的网址,该对象存储在pageLink数组中。current变量用于决定显示这些数组中的哪个元素。

19.6 启动线程

在这个 applet 中,runner 线程将在 start( )方法被调用时启动,并在 stop( )方法被调用时停止。

start( )方法在 init( )方法执行后以及程序重新启动时运行。下面是 start( )方法:

如果runner线程还没有启动,该方法将创建并启动它。

语句 runner = new Thread (this);使用一个参数(关键字 this)创建一个新的 Thread 对象,使用this使该applet运行在runner线程中。

语句 runner.start( );导致线程开始运行。线程开始后,将调用线程的 run( )方法。由于 runner线程是 applet 本身,因此将调用 applet 的 run( )方法。

19.6.1 运行线程

线程的主要工作是在 run( )方法中完成的。在 LinkRotator applet 中,run( )方法如下:

run( )方法做的第一件事情是创建一个名为 thisThread 的 Thread 对象,使用 Thread 类的类方法 currentThread( )给 thisThread 对象赋值,currentThread( )方法跟踪当前运行的线程。

该方法的所有语句都位于while循环中,该循环比较runner对象和thisThread对象,这两个对象都是线程,而且只要它们的值相同,while循环将一直执行下去。该循环中没有导致runner 和 thisThread 对象的值不同的语句,因此循环将不断进行下去,直到在循环外修改了其中一个线程对象。

run( )方法首先使用 repaint( );语句,接下来将 current 变量的值加1,如果 current 大于5,则将其重置为0.paint( )方法中的current变量用来决定显示哪个网站的信息。修改变量current将导致下次调用 paint( )方法时,显示不同网站的信息。

该方法包括一个try-catch语句,负责处理可能发生的错误。语句Thread.sleep(10000);让线程暂停10秒。该语句导致线程等待一段时间,让用户就有足够的时间阅读网站的名称和网址。catch 语句处理调用 Thread.sleep( )方法时可能发生的 InterruptedException 错误,如果在线程运行时将其中断,将发生这种错误。

19.6.2 停止线程

每当因为退出 applet 所在的页面而导致 applet 停止时,都将调用 stop( )方法,因此在该方法中停止运行的线程是最好的选择。LinkRotator applet 的 stop( )方法包含下面的语句:

if语句检测runner对象是否等于null。如果是,表明没有需要停止的活动线程;否则,将runner设置为null。

通过将runner对象设置为null,runner对象的值就与thisThread对象不同,进而导致run( )方法中的while循环停止运行。

19.7 处理鼠标单击

LinkRotator applet 需要完成的最后一项工作是事件处理:每当用户单击 Go 按钮,Web浏览器应打开列出的网站。这是使用 actionPerformed( )方法实现的,该方法在用户单击按钮时被调用。

下面是 LinkRotator applet 的 actionPerformed( )方法:

该方法首先停止runner线程。下一条语句创建一个名为browser的AppletContext对象。

AppletContext对象表示applet所处的环境,即它所属的页面和加载该页面的Web浏览器。

showDocument( )方法将指定的网络地址载入到浏览器。如果 pageLink[current]是有效的网址,showDocument( )方法将请求浏览器加载相应的网页。

19.8 循环显示链接

现在准备创建LinkRotator程序并进行测试。创建一个名为LinkRotator的Java空文件,然后输入程序清单19.2所示的内容。

程序清单 19.2 LinkRotator.java 程序的完整源代码

保存该程序之后,需要创建一个 Web 页面,将该 applet 放到其中。如果你在 NetBeans中运行 Run->Run File 对其测试,它无法正常运行,原因是链接无法打开。创建新的 Web 页面:选择 File->New File,然后单击“Other”,在弹出的“Choose File Type”对话框中的 File Type面板中找到HTML文件选项。将该Web页面命名为LinkRotator,该文件将被NetBeans存储为LinkRotator.html,然后再输入程序清单19.3中的内容。

程序清单 19.3 LinkRotator.html 的完整源代码

完毕之后,在Project面板中右键单击LinkRotator.html名字,然后选择View。该页面将在Web浏览器中打开,而且该applet循环显示每一个链接。单击Go按钮可以浏览相应的站点。图19.3所示为applet在IE中运行的结果。

图19.3 在 applet 窗口中循环显示链接

19.9 总结

线程是一个功能强大的概念,在Java中通过几个类和接口来实现。通过在应用程序中支持多线程,可提高程序的响应速度及其执行任务的速度。

即使读者在本章中什么也没学到,但至少现在知道了一个用于描述狂热生活方式的新术语,那就是多线程(multithreading)。

19.10 问与答

问:在 LinkRotator applet 中的 catch语句中不执行任何操作,这是为什么呢?

答:这取决于所捕获的错误或异常的类型。在 LinkRotator applet 中,由于你已经知道引发异常的原因是什么,因此 catch 语句中可以不执行任何操作,这都不会有问题。在 getURL( )方法中,只有当发送给该方法的URL无效,才会引发MalformedURLException异常。

19.11 测验

将你的线程放在一边,回答下列关于Java多线程的问题。

19.11.1 问题

1.程序要使用线程,必须实现哪个接口?

a.Runnable。

b.Thread。

c.Applet。

2.如果接口包含3个不同的方法,在实现了该接口的类中必须包含其中的几个方法?

a.一个也不需要。

b.所有的方法。

c.我知道,但是我不说。

3.你非常羡慕另一名程序员,他创建了一个同时处理4项任务的程序。你应对他说什么?

a.这不如我从网上下载的屏幕保护程序 Anna Kournikova 令人激动。

b.你是我前进的动力。

c.不错的线程(nice threads,也可以理解为衣服不错)。

19.11.2 答案

1.a.必须使用关键字implements来实现Runnable。Thread用于多线程程序中,但不需要在程序开头的class语句中使用。

2.b.接口要求实现它的类必须包括其所有方法。

3.c.如果程序员穿着考究,这种恭维容易引起混淆,但说实在的,这种可能性有多大呢?

19.12 练习

如果本章内容还没有让读者感觉到劳累,请完成下面的练习以提高技能:

如果你熟悉 HTML,创建自己的主页,其中包含 LinkRotator applet和 6 个最喜欢的网站。在页面中使用applet以及其他图形和文本。

在应用程序PrimeFinder中添加一个按钮,以便在计算素数时停止线程。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟