- 浏览: 47186 次
- 性别:
- 来自: 深圳
文章分类
最新评论
import java.util.LinkedList;
import java.util.Random;
public class ThreadDispatch extends Thread{
//需要暂用几个时间片
private int count;
//是否分配到了处理器标志
private volatile boolean holdCpu;
//暂用的处理器名称
private volatile String cpuName;
public ThreadDispatch(int count,String name) {
super(name);
this.count = count;
}
public void setCount(int count) {
this.count = count;
}
public void setHoldCpu(boolean holdCpu) {
this.holdCpu = holdCpu;
}
public void setCpuName(String cpuName) {
this.cpuName = cpuName;
}
//线程是否执行任务完毕,就是需要预先规定的需要得到时间片是否都得到了。
private volatile boolean finish = false;
//标志线程是否正在运行
public volatile boolean runing ;
public void run() {
for (int i = 0; i < count; i++) {
synchronized (this) {
while(!holdCpu){
//在没有得到处理器,则等待分配到处理器
//因为怕存在虚假唤醒,故在循环中等待。
//一直运行到失去处理器为止
System.out.println(Thread.currentThread().getName()
+ "准备就绪,需要处理器支援。。。。" + cpuName);
try {
//表示线程没有运行
runing=false;
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//表示线程得到了处理器,设置标志位为true 表示线程在运行
runing=true;
for (;;) {
if (!holdCpu){
break;
}
System.out.println(Thread.currentThread().getName()
+ "正在暂用处理器。。。。" + cpuName);
}
}
//当出了循环,标志着finish
finish = true;
runing=false;
}
public static void main(String[] args) throws InterruptedException {
LinkedList<ThreadDispatch> threads = new LinkedList<ThreadDispatch>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
threads.add(new ThreadDispatch(2,"pdy执行线程: "+i));
}
for (int i = 0; i < 10; i++) {
threads.get(i).start();
}
String[] CPUName = {"超人CPU","模型CPU","intl CPU"};
//10毫秒time片
final int cputime = 5;
IDEL idel = new IDEL(threads);
for (int i = 0; i < CPUName.length; i++) {
new CPU(cputime, idel, CPUName[i]).start();;
}
synchronized (ThreadDispatch.class) {
ThreadDispatch.class.wait();
}
}
public static class CPU extends Thread{
private final int cputime;
private final int ideltime = 10;
private final IDEL idel;
private final String cpuName;
public CPU(int cputime,IDEL idel, String cpuName) {
super();
this.cputime = cputime;
this.idel = idel;
this.cpuName = cpuName;
}
private ThreadDispatch dispatch;
@Override
public void run() {
while(true){
//处理器将会一直运行着。
//转调度处理程序,调出当前执行的task,换入新处理task
dispatch = idel.calloutAndnextThreadDispatch(dispatch);
System.out.println(dispatch);
if(dispatch == null){
//调度的新任务没有,则处理器一直空转着。
try {
System.out.println("处理器。。。。 " + cpuName + " 正在空转。。 没有干的");
Thread.sleep(ideltime);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue ;
}
//有新任务,则开始执行。
dispatch.cpuName=cpuName;
dispatch.holdCpu=true;
synchronized (dispatch) {
dispatch.notify();
}
try {
Thread.sleep(cputime);
} catch (InterruptedException e) {
e.printStackTrace();
}
dispatch.holdCpu=false;
while(dispatch.runing){
}
dispatch.cpuName=null;
}
}
}
/**
* 线程调度程序
* 按照时间片轮转
* @author Administrator
*
*/
public static class IDEL {
LinkedList<ThreadDispatch> threads ;
public IDEL(LinkedList<ThreadDispatch> threads) {
this.threads = threads;
}
public synchronized ThreadDispatch calloutAndnextThreadDispatch(ThreadDispatch dispatch){
if(dispatch != null)
callout(dispatch);
return threads.size() > 0 ? threads.removeFirst():null;
}
private void callout(ThreadDispatch dispatch) {
threads.remove(dispatch);
if(dispatch.isNotFinish()){
threads.addLast(dispatch);
}
}
}
public boolean isNotFinish() {
return !finish;
}
}
import java.util.Random;
public class ThreadDispatch extends Thread{
//需要暂用几个时间片
private int count;
//是否分配到了处理器标志
private volatile boolean holdCpu;
//暂用的处理器名称
private volatile String cpuName;
public ThreadDispatch(int count,String name) {
super(name);
this.count = count;
}
public void setCount(int count) {
this.count = count;
}
public void setHoldCpu(boolean holdCpu) {
this.holdCpu = holdCpu;
}
public void setCpuName(String cpuName) {
this.cpuName = cpuName;
}
//线程是否执行任务完毕,就是需要预先规定的需要得到时间片是否都得到了。
private volatile boolean finish = false;
//标志线程是否正在运行
public volatile boolean runing ;
public void run() {
for (int i = 0; i < count; i++) {
synchronized (this) {
while(!holdCpu){
//在没有得到处理器,则等待分配到处理器
//因为怕存在虚假唤醒,故在循环中等待。
//一直运行到失去处理器为止
System.out.println(Thread.currentThread().getName()
+ "准备就绪,需要处理器支援。。。。" + cpuName);
try {
//表示线程没有运行
runing=false;
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//表示线程得到了处理器,设置标志位为true 表示线程在运行
runing=true;
for (;;) {
if (!holdCpu){
break;
}
System.out.println(Thread.currentThread().getName()
+ "正在暂用处理器。。。。" + cpuName);
}
}
//当出了循环,标志着finish
finish = true;
runing=false;
}
public static void main(String[] args) throws InterruptedException {
LinkedList<ThreadDispatch> threads = new LinkedList<ThreadDispatch>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
threads.add(new ThreadDispatch(2,"pdy执行线程: "+i));
}
for (int i = 0; i < 10; i++) {
threads.get(i).start();
}
String[] CPUName = {"超人CPU","模型CPU","intl CPU"};
//10毫秒time片
final int cputime = 5;
IDEL idel = new IDEL(threads);
for (int i = 0; i < CPUName.length; i++) {
new CPU(cputime, idel, CPUName[i]).start();;
}
synchronized (ThreadDispatch.class) {
ThreadDispatch.class.wait();
}
}
public static class CPU extends Thread{
private final int cputime;
private final int ideltime = 10;
private final IDEL idel;
private final String cpuName;
public CPU(int cputime,IDEL idel, String cpuName) {
super();
this.cputime = cputime;
this.idel = idel;
this.cpuName = cpuName;
}
private ThreadDispatch dispatch;
@Override
public void run() {
while(true){
//处理器将会一直运行着。
//转调度处理程序,调出当前执行的task,换入新处理task
dispatch = idel.calloutAndnextThreadDispatch(dispatch);
System.out.println(dispatch);
if(dispatch == null){
//调度的新任务没有,则处理器一直空转着。
try {
System.out.println("处理器。。。。 " + cpuName + " 正在空转。。 没有干的");
Thread.sleep(ideltime);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue ;
}
//有新任务,则开始执行。
dispatch.cpuName=cpuName;
dispatch.holdCpu=true;
synchronized (dispatch) {
dispatch.notify();
}
try {
Thread.sleep(cputime);
} catch (InterruptedException e) {
e.printStackTrace();
}
dispatch.holdCpu=false;
while(dispatch.runing){
}
dispatch.cpuName=null;
}
}
}
/**
* 线程调度程序
* 按照时间片轮转
* @author Administrator
*
*/
public static class IDEL {
LinkedList<ThreadDispatch> threads ;
public IDEL(LinkedList<ThreadDispatch> threads) {
this.threads = threads;
}
public synchronized ThreadDispatch calloutAndnextThreadDispatch(ThreadDispatch dispatch){
if(dispatch != null)
callout(dispatch);
return threads.size() > 0 ? threads.removeFirst():null;
}
private void callout(ThreadDispatch dispatch) {
threads.remove(dispatch);
if(dispatch.isNotFinish()){
threads.addLast(dispatch);
}
}
}
public boolean isNotFinish() {
return !finish;
}
}
发表评论
-
api调用计数限制
2017-10-10 09:56 510import java.util.concurrent.Con ... -
多个key,单个value的缓存实现
2017-09-11 17:58 588假如一条记录可以用id,idcard,name分别唯一的查询到 ... -
java读写锁升级与降级、并会发现死锁。抛出异常
2017-08-10 16:35 970package com.huawei.test; impor ... -
用java代码来定时增量同步数据库表的实现代码
2017-04-20 17:08 11780import java.io.Serializable; im ... -
spring声明式事物不起作用的原因
2017-03-04 21:52 53509:41:37,848 [main] INFO jdbc. ... -
javac 和 java不同小版本时会报错,最后配置一样
2017-02-24 14:20 2859Information:Using javac 1.8.0_1 ... -
支持分布式的id生成器
2016-11-09 18:00 740import java.util.concurrent.ato ... -
Rabbitmq高可用设计思路
2016-10-14 17:41 2911Rabbitmq高可用设计思路 ... -
keepalived
2016-10-14 17:23 433对 keepalived 的理解是: 在一个局域网中,由几个服 ... -
rabbitmq实现高吞吐量的rpc调用
2016-10-09 16:21 9302rabbitmq实现rpc调用基本思路: 客户端(client ... -
shiro Ajax请求未登陆响应json串实现
2016-09-18 11:00 3879package com.cc.sec; import jav ... -
md5加密,jdk7 与jdk8对含有中文的明文加密注意
2015-12-29 12:27 1703private static final String ALG ... -
通过修改web.xml让服务器重启的问题
2015-11-26 09:28 921通过修改web.xml让服务器重启的问题? 通过修改web.x ... -
使用java反射机制实现java的深拷贝
2014-09-10 11:32 1386import java.lang.reflect.Constr ...
相关推荐
本项目“Java实现模拟单处理器的进程调度”聚焦于这一关键领域,通过Java编程语言来模拟真实操作系统中的调度算法。让我们深入探讨这个主题,了解如何使用Java来实现这个过程。 首先,我们要理解进程调度的基本概念...
处理器调度算法: 先来先服务, 时间片轮转, 短作业优先, 最高响应比优先 存储管理: FIFO, LRU 磁盘移臂调度: SSTF, SCAN 文件管理: 运用空闲盘块表的方式组织磁盘空间, 模拟文件的 create() 和 delete() 操作
模拟在单处理器环境下的处理器调度,从而让我们更加深入的了解处理器调度的原理和工作过程。
【优先数调度算法实现处理器调度】是操作系统中进程管理的一部分,主要目的是在多个就绪进程之间公平、高效地分配处理器资源。在这个实验中,我们关注的是动态优先数调度算法,这是一种根据进程执行情况动态调整...
整个实验是模拟了单处理系统处理进程的机制,采用了轮转算法和优先数算法。经过这次实验,加深了对操作系统中单处理系统的进程调度的认识。此外,还学习并使用了进度条、表格等多种java的控件,对线程也有了更深的...
### Java设计一个按优先数调度算法实现处理器调度的程序 #### 实验背景与目标 本实验旨在通过Java语言实现一种基于优先数的处理器调度算法。该算法的核心在于根据进程的优先级来决定其运行顺序,优先级高的进程...
设计一个按时间片轮转法实现处理器调度的程序
总之,Java模拟操作系统中的进程调度算法是学习操作系统课程的经典实践项目。通过FCFS、SJF、RR和HRN这四种算法的实现,我们可以更好地理解和掌握进程调度的基本原理,为设计和优化更复杂的调度策略打下坚实基础。
本次试验是使用程序来模拟操作系统中进程调度的三种不同的调度策略,分别为最短作业...SJF.java是模拟实现最短作业优先的调度策略。 RR.java是模拟实现时间片轮转的调度策略。 HRRN.java是模拟最高响应比的调度策略。
Java 作为一种多平台、面向对象的语言,提供了丰富的工具和库,使得实现这样的模拟成为可能。 首先,我们需要了解基本的进程调度概念。进程调度的目标是优化系统的整体性能,通常通过不同的调度策略实现,如先来先...
本资源使用Java和JavaFX模拟了单处理器系统进程调度的源代码。该资源的文字版信息请访问博客《操作系统实验:单处理器系统的进程调度(学习笔记)》...
认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成单处理器系统中的进程调度, 要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的...
在这个Java模拟进程调度的例子中,我们将深入探讨三种常见的调度算法:优先级算法、时间片轮转算法以及短作业优先算法。 1. **优先级算法**: 优先级算法基于每个进程被赋予的优先级来决定哪个进程应该获得CPU执行...
1、设计一个程序实现基于优先数的时间片轮转调度算法调度处理器。...4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一
由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行 (4)、进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间...
在操作系统中,进程调度是核心功能之一,它决定了系统如何有效地在多个进程中分配CPU资源,以确保系统的公平性和效率。本项目是一个基于Java实现的进程调度模拟器,它具有图形用户界面,使得用户能够直观地观察和...
处理器调度是操作系统中的核心功能之一,它涉及到计算机系统如何有效地分配有限的处理器资源给多个待执行的任务或进程。在多道程序设计的系统环境中,由于多个进程可能同时处于就绪状态,因此必须有一个智能的调度...
操作系统是计算机科学中的核心课程,其中进程调度算法和进程模拟是关键知识点,对于理解系统如何高效地管理和分配资源至关重要。本资料集以Java语言为基础,深入讲解了这些概念,旨在帮助学习者掌握操作系统的核心...
内容是完成单处理器系统的进程调度,实现时间片轮转、优先数、短进程优先和短剩余时间优先共4种调度算法,并用图形界面显示。 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 正确的输入:1、...