面向对象程序设计A(Java)
实验报告
实验名称: 多线程实验
实验类型:
指导教师: 刘涌
专业班级: 信安1203
姓 名: 黄学强
学 号: 20111899
实验地点: 东六E301
实验成绩:
日期: 20##年4月30日
实验六多线程实验
一、实验目的:
练习多线程类的两种实现方法,理解多线程程序的生命周期。
二、实验内容:
编写一多线程程序,实现如下功能:
(1)一个线程进行阶乘和的运算(1!+2!+3!+……+30!),每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔0.1秒时间读取上个线程的运算结果和计算进程,并在图形界面中实时显示结果。
三、实验要求
1正确设计显示运行结果和计算进程的图形用户界面;
2分别采用Thread类的子类和Runable接口两种方式完成两个线程的设计;
3进行全面的测试并分析测试结果;
四、实验设计
1、先用Java Application 方式建立应用程序框架。 其中选用frame on screen ;
2、实现界面设计。 其中用 xyLayout布局。
3、 用两种方法实现多线程
方法一、设计两个线程ComputeThread 和ReadThread线程分别继承Thread线程。
ComputeThread线程实现阶乘和运算,用for循环实现阶乘和运算。ReadThread线程实现在窗口显示结果和进程。
方法二、ComputeThread 和ReadThread线程分别接口Runnable。
运算方法同上。
五、实验过程
1、按照设计的步骤实现。
遇到的问题:Text只显示到6!
解决方法:删除ReadThread的run()方法下while循环语句中的count++,因为ReadThread线程和ComputeThread线程不同步。
2、 用setValue()方法显示进度条,setText()方法显示结果。
六、实验结果
讨论与分析
进行全面的测试并分析测试结果;
新建——Thread.State.NEW:当一个 Thread 类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源start方法尚未被调整用就绪可执行状态——Thread.State.RUNNABLE:处于新建状态的线程被启动后,将进入线程队列排队,这个时候具备了运行的条件,一旦轮到 CPU 的时候,就可以脱离创建它的主线程独立开始自己的生命周期运行:就绪的线程被调度进入运行状态,每一个 Thread 类及其子类的对象都有一个重要的run方法,当线程对象被调度执行的时候,它将自动调用本对象的 run方法,从第一句代码开始执行。
简要说明你在该实验中的收获与体会。
(1)首先:java 程序是建立在线程之上的。.
(2)创建线程必须继承 Thread class 它已经为线程的创建和运行做了必要的配置。run是线程就重要的方法。你必须覆写这个方法达到你想要的目的。
(3)run方法所包含的代码就是和其他线程同时运行的代码以达到同一时刻运行多段代码的目的。当终止了 run以后。这个线程也就结束了。调用线程的 start方法才会执行 run方法。
体会:
通过实验设计了正确的显示运行结果和计算进程的图形用户界面;完成了对分别采用Thread类的子类和Runable接口两种方式完成两个线程的设计;并且进行全面的测试并分析测试结果;对Java的学习有了很大的提升作用。
附录:
代码
阶乘运算
for(n = 1 ; n <= 30 ; n++)
{
save = save * n ; //进行阶乘
sum = sum + save ; //进行阶乘和运算
str = "+" + n + "!" ;
str1 = str1 +str ; //字符串相加
try {
Thread.sleep(500 + (int) (Math.random() * 500));//随机生成 05~1秒
}
catch (InterruptedException ex) {
}
}
显示结果 和进度条
while (true) {
f.text.setText(ct.str1); //显示阶乘字符
f.jd.setValue(ct.n); //显示进度条
String s = String.valueOf(ct.sum);
f.text1.setText(s); //显示结果
try {
Thread.sleep(100); //休眠100毫秒
}
catch (InterruptedException ex) {
}
}
单击开始按钮
void jButton1_actionPerformed(ActionEvent e) {
ComputeThread ct = new ComputeThread();
ReadThread rt = new ReadThread(ct , this);
//ct.start(); 继承Thread类则:
//rt.start();
new Thread(ct).start();//接口Runnableze:
new Thread(rt).start();
}