实验6:多线程实验 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:
面向对象原理与Java实践课程实验报告
实验6:多线程实验
姓名林浩强
班级网络14-2
学号 14034460220
实验地点软件实验室
实验时间 2016.6.7
指导教师姚明
一、实验目的:
●了解线程调度机制
●理解线程同步机制
●掌握线程设计方法
二、实验要求:
●掌握线程创建的方法
●掌握线程的基本控制方法
●掌握线程间的同步控制方法
三、实验内容:
1、随机生成1万个整数,利用线程技术计算两种不同排序算法对这些数排序的运行时间。
2、有一水塘,可实现注水和排水操作。当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作。创建水塘类Pond、注水线程Injection和排水线程Drain,假设注水线程可以在10分钟内将水塘注满水,排水线程可以在10分钟内将水塘的水全排出。试实现水塘的注水和排水过程。
四、设计思路:
首先,第一个实验的需求是随机生成10000个整数并且按两种算法排序,并利用线程的方式计算排序时间。我用的排序算法是冒泡排序和选择排序法,在排序的前后分别用System 类的CurrentTimeMillis()方法获取当前时间的毫秒值,作差求出排序所用的时间。最后在SortDemo类中启动线程即可。、
第二个实验的需求是实现注水和排水的操作,题目中指出“当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作”,所以我采用了线程的等待唤醒机制来实现。首先在Pond类中声明一个标记变量flag,把注水和排水的操作封装成为功能并加了同步关键字synchronize,方法中运用了同步唤醒机制实现依次的一次一个输出。然后在Injection类和Drain类中调用同步方法即可。最后,在PondDemo中启动线程即可。
五、程序源代码:
实验题目1:
package java6_Test;
import java.util.Random;
public class Sort1 extends Thread {
private Object obj = new Object();
//重写run方法
public void run() {
//计时开始
long l1 = System.currentTimeMillis();
//用Object类对象设置同步锁
synchronized (obj) {
//随机生成10000个数并用相应长度数组来储存这些数
int[] data = new int[10000];
for (int x = 0; x < 10000; x++) {
int b = r.nextInt();
System.out.println(this.getName() + ":" + b);
data[x] = b;
}
//调用自定义方法sort1
sort1(data);
//计时结束,计算所需的时间并输出
long l2 = System.currentTimeMillis();
System.out.println("共耗时"+(l2 - l1)+"毫秒");
}
}
//冒泡排序法对数组中的数进行排序
private synchronized void sort1(int[] data) {
for (int x = 0; x < data.length - 1; x++) {
for (int y = 0; y < data.length - 1 - x; y++) {
if (data[y] > data[y + 1]) {
int temp = data[y];
data[y] = data[y + 1];
data[y + 1] = temp;
}
}
}
System.out.println(this.getName()+"排序完成!");
}
}
package java6_Test;
import java.util.Random;
public class Sort2 extends Thread {
private Object obj = new Object();
//重写run方法
public void run() {
//计时开始
long l3 = System.currentTimeMillis();
//用Object类对象设置同步锁
synchronized (obj) {
//随机生成10000个数并用相应长度数组来储存这些数
int[] data = new int[10000];
for (int x = 0; x < 10000; x++) {
int b = r.nextInt();
System.out.println(this.getName() + ":" + b);
data[x] = b;
}
//调用自定义方法sort2
sort2(data);
//计时结束,计算所需的时间并输出
long l4 = System.currentTimeMillis();
System.out.println("共耗时" + (l4 - l3) + "毫秒");
}
}
//选择排序法对数组中的数进行排序
private synchronized void sort2(int[] data) {
for (int x = 0; x < data.length - 1; x++) {
for (int y = x + 1; y < data.length; y++) {
if (data[y] < data[x]) {
int temp = data[x];
data[x] = data[y];
data[y] = temp;
}
}
}
System.out.println(this.getName()+"排序完成!");
}
}
package java6_Test;
public class SortDemo {
public static void main(String[] args) {
//创建线程类的对象
Sort1 s1 = new Sort1();
Sort2 s2 = new Sort2();
//启用线程s1、s2
s1.start();
s2.start();
}
}