java多线程实现调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆交通大学综合性设计性实验报告
实验项目名称:进程调度(先来先服务)
实验项目性质: JAVA多线程
实验所属课程: JAVA程序设计
实验室(中心):语音大楼 8 楼 801
班级:软件专业 2012级2班
姓名:尚亚*
学号: 631206050216
指导教师:杨
实验完成时间: 2014 年 11 月 25 日
一、实验目的
1、理解程序、线程和进程的概念;
2、理解多线程的概念;
3、掌握线程的各种状态;
4、熟练使用Thread类创建线程;
5、熟练使用线程各种方法;
6、掌握线程的调度及线程同步的实现原理。
二、实验内容及要求
进程调度是处理机管理的核心内容。本实验要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念。并体会了优先数和先来先服务调度算法的具体实施办法。
用JA V A语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。做一个能够直观体现多个进程时,CPU 是怎样调度就绪队列中的进程(按照先来先服务的原则)。
三、实验设备
PC机,windows7,eclipse。
四、设计方案
㈠设计主要思想
(1)要模拟进程的调度算法,必须先体现处进程及系统资源。
(2)要体现先来先服务的算法,就必须表现出当有一个进程进入CPU时其他进程不能进入,并在就绪队列中排队。本实验建立了四个圆移动的线程表示作业调度,用圆在表示就绪队列的方框中停留表示进程在就绪队列中排队。
(3)当有一个圆移动到表示CPU的范围内时,让其它线程在就绪队列中排队,当CPU内无进程时,先来的圆先移动,以表示CPU 对进程的调度。
㈡设计的主要步骤
(1)建立四个不同颜色的圆移动的线程,表示对四个进程的调度。
(2)当有一个表示进程的圆到达表示CPU范围内时,通过让其它几个圆停留在表示就绪队列的方框范围内,表示进程在就绪队列中排成队列。
(3)当第一个先到达的进程释放CPU,在排成队列的几个圆中选择先到达的圆,使其移动表示对先来的进程进行调度,直到所有的圆移动完毕。
五、主要代码
import java.awt.Font;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class DoubleBuffer extends Frame //主类继承Frame类
{ private JButton button1;
private Image iBuffer,iBuffer1;
private Graphics gBuffer1,gBuffer2,gBuffer3,gBuffer4,gBuffer5,gBuffer6;
public paintThread pT1;//绘图线程
public paintThread pT2;//绘图线程
public paintThread pT3;//绘图线程
public paintThread pT4;//绘图线程
public int x1=100,y1=100;//小圆横、纵坐标
public int x2=100,y2=170;//小圆横、纵坐标
public int x3=100,y3=240;//小圆横、纵坐标
public int x4=100,y4=310;//小圆横、纵坐标
public int a=1;
public int b=2;
public int c=3;
public int d=4;
public DoubleBuffer()//构造函数
{
super("Java实现调度模拟");
this.setResizable(false); //窗体不可最大化
this.setSize(750,470); //设置窗口的首选大小
this.setVisible(true); //显示窗口
button1= new JButton("运行");
pT1=new paintThread(this,1);
pT2=new paintThread(this,2);
pT3=new paintThread(this,3);
pT4=new paintThread(this,4);
button1.setLocation(100, 415);
button1.setSize(90, 40);
add(button1);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub
x1=100;
y1=100;//小圆横、纵坐标
x2=100;
y2=170;//小圆横、纵坐标
x3=100;
y3=240;//小圆横、纵坐标
x4=100;
y4=310;//小圆横、纵坐标
a=1;
b=2;
c=3;
d=4;
pT1.start(); //绘图线程启动
pT2.start(); //绘图线程启动
pT3.start(); //绘图线程启动
pT4.start(); //绘图线程启动
}
});
}
public void paint(Graphics scr) //重载绘图函数
{
scr.setColor(Color.RED); //设置小圆颜色
Font font1 = new Font("宋体", Font.BOLD, 30);
scr.setFont(font1);
scr.drawString("CPU", 580, 235);
Font font = new Font("宋体", Font.BOLD, 20);
scr.setFont(font);
scr.drawString("线程一", 250, 135);
scr.fillOval(x1,y1,60,60); //绘制小圆