月份时,系统自动把日期的选择范围限制到1~31之间;当用户单击“录入”按扭时,系统把所有的学生信息打印在屏幕上。
实训十二 多线程机制
一、实训目的
1.线程的概念,线程的生命周期。
2.多线程的编程:继承Thread类与使用Runnable接口。 3.使用多线程机制实现动画。 二、实训要求
1.理解用创建Thread子类的方法实现多线程。 2.理解用实现Runnable接口的方法实现多线程。 3.利用多线程编程实现一个正在旋转的地球。 三、实训内容
程序(program)是对数据描述与操作的代码的集合,是应用程序执行的脚本。进程(process)是程序的一次执行过程,是操作系统运行程序的基本单位。程序是静态的,进程是动态的。系统运行一个程序就是一个进程从创建、运行到消亡的过程。线程是比进程更小的运行单位,是程序中单个顺序的流控制。一个进程中可以包含多个线程。线程是一种特殊的多任务方式。当一个程序执行多线程时,可以运行两个或更多的由同一个程序启动的任务。这样,一个程序可以使得多个活动任务同时发生。
1.使用线程创建动画的程序(如下图) (1)程序功能:创建一个显示小球不断跳动并显示不同状态的动画程序。要达到无闪烁现象,显示速度快,占用内存较小的要求。即要使用双缓冲技术创建图像的显示方式,清除闪烁现象。使用线程分别解决准备图像、显示图像的任务,解决显示速度慢,占用内存较大的问题。
程序说明:
程序中使用图形双缓冲技术,显示一组图像。程序实现Runnable 接口中的run 方法,这是一个和Applet 同时运行的线程。对线程的控制由Applet 的start 和stop 方法完成,Applet 运行时,就在start 方法中启动线程,Applet 停止时,就在stop 方法中停止线程。
在线程td 的run 方法中的永恒循环当中,实现图像的轮流显示使小球不停的跳动。首先调用绘图对象g1 的drawImage 方法把当前图像画在屏幕缓冲区内,在paint 方法中把屏幕缓冲区拷贝到屏幕上。但paint 方法无法直接调用,因为要传递给它一个图形参数g,故调用repaint 方法间接调用paint方法。repaint 方法无参数,它将调用update 方法,由update 方法调用paint 方法并传递g 参数。这就是曾介绍过的一个线程负责准备图像而另一个线程负责显示图像的动画方法。
(2)准备10 个图像文件(T1.JPG~T10.JPG),它们分别显示小球不同时间的高度和状态,存放在“程序/image”目录下。这是创建动画的基础工作,是动画显示的内容,应用程序只是解决图像“动”即显示的方式。
(3)编写该程序文件,源代码如下。 import java.awt.*; import java.applet.*;
public class LX13_1 extends Applet implements Runnable {
Image img[]=new Image[10]; Image buffer; Graphics g1; Thread td; int index=0;
public void init() {
buffer=createImage(getWidth(),getHeight());//创建图像缓冲区 g1=buffer.getGraphics();//创建绘图区 for (int i=0;i<10;i++)
img[i]=getImage(getCodeBase(),\}
public void start() {
if (td==null) {
td=new Thread(this);//创建线程对象 td.start(); } }
public void stop() {
if (td!=null)
td=null;
}
public void run() {
while(true) {
g1.drawImage(img[index],10,20,this);//画图像到缓冲区 repaint();//画出图像 try {
td.sleep(50);
} catch (InterruptedException e) {}
g1.clearRect(10,20,100,100);//清除缓冲区中的图像 index=++index; } }
public void paint(Graphics g) {
g.drawImage(buffer,0,0,this);//画出缓冲区中图像 }
public void update(Graphics g) {
paint(g);
}
}
(4)编写显示LX13_1.class 的页面文件,在浏览器中显示结果。 2.运行下面的程序,理解用创建Thread子类的方法实现多线程。 class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str); }
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + \try {
sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} }
System.out.println(\} }
public class TwoThreadsTest {
public static void main (String[] args) {
new SimpleThread(\new SimpleThread(\} }
3.运行下面的程序,理解用实现Runnable接口的方法实现多线程。 //这是一个时钟Applet,它显示当前时间并逐秒进行更新。 import java.awt.*; import java.applet.*; import java.util.*;
public class Clock extends Applet implements Runnable{
Thread clockThread; public void start(){
if(clockThread==null){
clockThread=new Thread(this,\clockThread.start(); } }
public void run(){
while(clockThread !=null){ repaint();
try{
clockThread.sleep(1000); }catch(InterruptedException e){} } }
public void paint(Graphics g){
Date now=new Date();
g.drawString(now.getHours()+\}
public void stop(){
clockThread.stop(); clockThread=null; }
}
4.自主设计题
设计一个交通信号灯类:
(1)变量:位置、颜色(红、黄、绿)、显示时间。
(2)方法:切换信号灯。创建并启动两个线程(东西向、南北向)同时运行。 3.实验要求
(1)根据需要设计多个线程。 (2)设计路口信号灯示意图界面。
(3)可将信号灯按方向分为3 种车道灯:左转、直行和右转。 (4)根据车流量进行时间的模糊控制。
实训十三 流式输入输出
一、实训目的
1.了解流式输入输出的基本原理。
2.掌握类File,FileInputStream,FileOutputStream,RandomAccessFile的使用方法。 二、实训要求
1.学习文件和目录的简单操作。
2.创建一个顺序文件,向其中写入部分用户键盘输入的字符,并回显在屏幕上。 3.学习随机文件的读写。 三、实训内容
1.运行下面的程序,学习文件和目录的简单操作。 //运行前先在当前目录中建立一个目录,目录名为test,向其中随意放入几个文件。import java.io.*;
public class FileOperation{
public static void main(String args[]){
try{
BufferedReader din = new BufferedReader(new InputStreamReader(System.in));
String sdir = \String sfile;
File Fdir1=new File(sdir);
if (Fdir1.exists()&&Fdir1.isDirectory()){
System.out.println(\for( int i=0; i< Fdir1.list().length; i++) //列出目录下内容
System.out.println( (Fdir1.list())[i]); File Fdir2=new File(\if(!Fdir2.exists()) Fdir2.mkdir();
相关推荐: