Java实现时间片轮转调度算法的示例代码

 更新时间:2023年07月28日 14:15:28   作者:小L~~~  
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,这篇文章主要为大家介绍了如何利用Java实现这一算法,需要的可以参考一下

本程序用时间片轮转调度算法对五个进程进行调度,假设每个进程初始状态为就绪状态。

程序中的某进程运行时间以时间片单位为2进行计算。

实现代码

package bean;
public interface process_scheduling_algorithm {
    public void round_cal();
    public pcb get_process_round();
    public int process_finish();
    public void display_round();
    public void set_state();
    public void cpu_round(pcb q);// 采用时间片轮转调度算法执行某一进程
    public pcb get_next(pcb k, pcb head);
}
package bean;
public class pcb implements Cloneable{
    private String name;//进程名
    private int cputime;//CPU 运行时间
    private int needtime;//运行所需的时间
    private int count;//执行次数
    private int round;//时间片轮转轮次
    private state process;//进程状态
    private pcb next;
    public Object clone() {
        pcb person = null;
        try {
            person = (pcb)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return person;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setCputime(int cputime) {
        this.cputime = cputime;
    }
    public int getCputime(){
        return cputime;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public int getCount(){
        return count;
    }
    public void setNeedtime(int needtime){
        this.needtime = needtime;
    }
    public int getNeedtime(){
        return needtime;
    }
    public void setRound(int round) {
        this.round = round;
    }
    public int getRound(){
        return round;
    }
    public void setProcess(state process) {
        this.process = process;
    }
    public state getProcess(){
        return process;
    }
    public void setNext(pcb p){
        if(p!=null)next = (pcb) p.clone();
        else next = null;
    }
    public pcb getNext(){
        return next;
    }
}
enum state{
    ready,
    execute,
    block,
    finish
};// 定义进程状态
package bean;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class round_robin implements process_scheduling_algorithm,Cloneable{
    public static final int P_NUM = 5;
    public static final int P_TIME = 50;
    public static List list = new LinkedList<pcb>();
    //public int position = 1;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public void round_cal() {
        pcb p,r;
        p = get_process_round();
        //System.out.println(p.getName()+"--------");
        //display_round(p);
        int cpu = 0;
        r = (pcb)p.clone();//r = p;
        while (process_finish() == 0){
            cpu += 2;
            cpu_round(r);
            r = (pcb) get_next(r,p).clone();//r = get_next(r,p);
            // System.out.println(r.getName() + "------");
            System.out.println("cpu  " + cpu);
            display_round();
            set_state();
        }
    }
    @Override
    public pcb get_process_round() {
        pcb q = new pcb();
        pcb t = new pcb();
        pcb p = new pcb();
        int i = 0;
        System.out.println("input name and time");
        while(i < P_NUM){
            q.setName(cin.next());
            q.setNeedtime(cin.nextInt());
            q.setCputime(0);
            q.setRound(0);
            q.setCount(0);
            q.setProcess(state.ready);
            q.setNext(null);
            if(i == 0){
                // p = q;
                p = (pcb) q.clone();
                //System.out.println(p.needtime + "---------");
                //t = q;
                t = (pcb) q.clone();
                list.add(t);
            } else {
                //t.next = q; //创建就绪进程队列
                t.setNext(q);
                //t = q;
                t = (pcb) q.clone();
                list.add(t);
            }
            i++;
        }
//        for(int x=0;x<list.size();x++) {
//        	pcb temp = (pcb) list.get(x);
//        	System.out.println(temp.getName());
//        }
        //System.out.println(p.getName() + "------");
        return p;
    } //输入模拟测试的进程名和执行所需时间
    @Override
    public int process_finish() {
        //System.out.println(q.needtime + "------------");
        int bl = 1,i = 0;
        while(bl!=0 && i < list.size()){
            pcb q = (pcb) list.get(i);
            if(bl != 0 && q.getNeedtime() == 0)bl = 1;
            else bl = 0;
            i++;
            //q = q.next;
            // q = q.getNext();
            // System.out.println(q.getName());
        }
        return bl;
    }
    @Override
    public void display_round() {
        System.out.println("NAME         CPUTIME         NEEDTIME         COUNT         ROUND         STATE");
        for(int i=0;i<list.size();i++){
            pcb p = (pcb) list.get(i);
            System.out.print(p.getName() + "             ");
            System.out.print(p.getCputime() + "               ");
            System.out.print(p.getNeedtime() + "               ");
            System.out.print(p.getCount() + "              ");
            System.out.print(p.getRound() + "           ");
            switch (p.getProcess()){
                case ready:
                    System.out.println("ready");
                    break;
                case execute:
                    System.out.println("execute");
                    break;
                case finish:
                    System.out.println("finish");
                    break;
            }
            //p = p.getNext();
        }
    }
    @Override
    public void set_state() {
        for(int i=0;i<list.size();i++){
            pcb p = (pcb) list.get(i);
            if(p.getNeedtime() == 0) p.setProcess(state.finish);
            if(p.getProcess() == state.execute) p.setProcess(state.ready);
            //p = p.getNext();
        }
    }
    @Override
    public void cpu_round(pcb q) {
        q.setCputime(q.getCputime() + 2);//q.cputime += 2;
        q.setNeedtime(q.getNeedtime() - 2);//q.needtime -= 2;
        if (q.getNeedtime() < 0) q.setNeedtime(0);
        q.setCount(q.getCount() + 1);//q.count++;
        q.setRound(q.getRound() + 1);//q.round++;
        q.setProcess(state.execute);//q.process = state.execute;
        for(int i=0;i<list.size();i++) {
            pcb temp = (pcb) list.get(i);
            if(q.getName() == temp.getName()) {
                list.remove(i);
                list.add(i, q);
            }
        }
    }//采用时间片轮转调度算法执行某一进程
    @Override
    public pcb get_next(pcb k, pcb head) {
        //System.out.println(k.getName() + " " + head.getName() + "------");
        pcb t;
        t = (pcb) k.clone();//t = k;
        int opsition = 0;
        for(int i=0;i<list.size();i++) {//从列表中查找k的位置
            pcb temp = (pcb) list.get(i);
            if(t.getName() == temp.getName()) {
                opsition = i;
                break;
            }
        }
        do {
            //t = t.getNext();//t = t.next;
            if(opsition+1 < list.size()) {
                t = (pcb) list.get(++opsition);
                //System.out.println(t.getName() +"-----------");
                //break;
            }
            else{
                opsition++;
                break;
            }
        }while(t != null && t.getProcess()== state.finish && opsition < list.size());
        if(opsition == list.size()) {
            t = (pcb) head.clone();//t = head;
            //System.out.println(t.getName() + " -------------");
            //while (t.getNext() != k && t.getProcess() == state.finish) t = t.getNext();
            for(int i = 0; i < list.size(); i++){
                pcb temp = (pcb) list.get(i);
                if(temp.getName() == t.getName()){
                    opsition = i;
                    break;
                }
            }
            do {
                if(opsition+1 < list.size()) t = (pcb) list.get(++opsition);
                //opsition++;
            }while(t != null && t.getNext() != k && t.getProcess() == state.finish && opsition < list.size());
        }
        return t;
    }
    public static void main(String[] args) {
        round_robin test = new round_robin();
        test.round_cal();
    }
    public Scanner cin = new Scanner(System.in);
}
/*测试样例一
a1 2
a2 3
a3 4
a4 5
a5 6
测试样例二
a1 2
a2 3
a3 4
a4 2
a5 4
 */

到此这篇关于Java实现时间片轮转调度算法的示例代码的文章就介绍到这了,更多相关Java时间片轮转调度算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot 集成easy-captcha实现图像验证码显示和登录

    springboot 集成easy-captcha实现图像验证码显示和登录

    本文主要介绍了springboot 集成easy-captcha实现图像验证码显示和登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 详解Java String中intern方法的原理与使用

    详解Java String中intern方法的原理与使用

    这篇文章主要为大家介绍了Java String中intern方法的原理以及使用。文中通过图片和示例代码进行了详细展示,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • 详解Java的JDBC API中事务的提交和回滚

    详解Java的JDBC API中事务的提交和回滚

    这篇文章主要介绍了Java的JDBC API中事务的提交和回滚,JDBC是Java用于和数据库软件连接的API,需要的朋友可以参考下
    2015-12-12
  • Java实现多个数组间的排列组合

    Java实现多个数组间的排列组合

    这篇文章主要为大家详细介绍了Java实现多个数组间的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Spring定时任务无故停止又不报错的解决

    Spring定时任务无故停止又不报错的解决

    这篇文章主要介绍了Spring定时任务无故停止又不报错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java乐观锁原理与实现案例分析

    java乐观锁原理与实现案例分析

    这篇文章主要介绍了java乐观锁原理与实现,结合具体案例形式分析了乐观锁的原理及java使用乐观锁实现自动派单功能的相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • pageHelper一对多分页解决方案示例

    pageHelper一对多分页解决方案示例

    这篇文章主要为大家介绍了pageHelper一对多分页解决方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java常用正则表达式验证类完整实例【邮箱、URL、IP、电话、身份证等】

    Java常用正则表达式验证类完整实例【邮箱、URL、IP、电话、身份证等】

    这篇文章主要介绍了Java常用正则表达式验证类,结合完整实例形式分析了Java针对邮箱、网址URL、IP地址、电话、身份证等正则验证相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Java多线程中的ReentrantLock可中断锁详细解读

    Java多线程中的ReentrantLock可中断锁详细解读

    这篇文章主要介绍了Java多线程中的ReentrantLock可中断锁详细解读,ReentrantLock中的lockInterruptibly()方法使得线程可以在被阻塞时响应中断,比如一个线程t1通过lockInterruptibly()方法获取到一个可重入锁,并执行一个长时间的任务,需要的朋友可以参考下
    2023-12-12
  • Spring AOP定义Before增加实战案例详解

    Spring AOP定义Before增加实战案例详解

    这篇文章主要介绍了Spring AOP定义Before增加,结合实例形式详细分析了Spring面向切面AOP定义Before增加相关定义与使用技巧,需要的朋友可以参考下
    2020-01-01

最新评论