实验6:多线程实验 (1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

}

相关文档
最新文档