操作系统实验报告-基于线程的编程技术
一、实验目的和要求
理解线程的定义和概念,掌握线程的实现方案。熟悉基于多线程的编程技术,编程实现简单的多线程编程实例。
熟练掌握一种以上的开发工具,如C++、JAVA、Delphi、VB等,掌握基本的编程技巧,自由选择一种编程语言设计并实现实验内容。
二、实验方法与步骤(需求分析、算法设计思路、流程图等)
需求分析:Java在语言级基础上支持多线程的设计,通过设计一个Java程序实现多线程,体现出多线程程序在运行时的特点,以及线程调度和执行的过程。
算法设计思路:在Java中,设计多线程有两种方式,本实验采用通过实现Runnable接口的方式。设计线程类MyThread,添加成员变量name为线程的对象名字,实现Runnable接口中的run()方法,若当前线程名为‘线程1’求出两个随机数的最大公约数,线程名为‘线程2’则求出求出两个随机数的最小公倍数,线程名为其他时什么也不做。在程序运行时,除了一个主线程外,还有其他若干个子线程在求随机数的最大公约数或最小公倍数或什么也不做。
流程图:
三、实验原始纪录(源程序、数据结构等)
1.MyThread类:
public class MyThread implements Runnable {
private String name; //成员变量,线程名称
@Override
public void run() {
//run方法通过判断线程名称执行不同操作
for (int i = 0; i < 5; i++) {
int a = (int) (Math.random()*100);
int b = (int) (Math.random()*100);
if ("线程1".equals(name)){
System.out.println("我是"+name+","+a+"和"+b+"的最大公约数:" + gcd(a, b));
} else if ("线程2".equals(name)) {
System.out.println("我是"+name+","+a+"和"+b+"的最小公倍数:" + lcm(a, b));
} else {
System.out.println("我是"+name+","+"我啥也不干!");
}
}
}
//求最大公约数
public int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
//求最小公倍数
public int lcm(int a,int b) {
return a*b/gcd(a,b);
}
public MyThread() {
}
public MyThread(String name) {
this.name = name;
}
}
2.测试类ThreadTest:
public class ThreadTest {
public static void main(String[] args) {
Thread t1 = new Thread(new MyThread("线程1"));
Thread t2 = new Thread(new MyThread("线程2"));
Thread t3 = new Thread(new MyThread("线程3"));
t1.start();
t2.start();
t3.start();
Thread.currentThread().getThreadGroup().list();//显示当前所有线程列表
}
}
四、实验结果及分析(计算过程与结果、数据曲线、图表等)
实验结果分析:
从Thread.currentThread().getThreadGroup().list();方法执行显示程序在运行时有5个线程,1个是主线程,1个是Monitor Ctrl-Break线程,经上网查询为开发工具运行程序时自带创建的,其他3个是main方法中创建的3个线程对象。Start方法启动所有线程后,由于每个线程的优先级都为5,所以他们随机被调度执行,表现为并发运行。
五、实验改进与思考
通过本次实验内容的学习和操作,让我对多线程内容知识有了更深一步的认识。多线程即是在一个程序中包含了一个以上的线程,它们通过cpu来进行快速的切换运行,因为其切换的速度非常快,所以使我们感觉它们是在同时进行的。在java程序中,每个程序都包含了一个执行main()函数的默认主线程,创建的其他线程对象必须是继承Thread类或者实现Runnable接口的类,在类中覆写run()方法来执行想实现的功能。而在主线程中要使用线程的start方法才能执行run中的内容,而当run执行结束后,线程也结束了。
在实践写代码过程中也遇到许多问题。通过实现Runnable接口的线程类不能直接创建该类的对象使用,而是将该对象作为Thread对象构造方法的参数。在程序执行前,我错误认为程序内的线程是轮流顺序被调度执行的,而通过执行结果和相关知识的查询,当线程优先级相同时,每个线程应当是随机被调度执行的。