如何在使用Java的循环调度中将一个线程更改为另一个线程

如何在使用Java的循环调度中将一个线程更改为另一个线程,java,scheduling,round-robin,Java,Scheduling,Round Robin,文件已经给出,我应该只编辑RoundRobinScheduler类中的块#2部分。 我尝试使用索引来安排每个线程。它按顺序成功运行,但无法作为“循环”调度从一个线程切换到另一个线程。 线程是否有任何函数可以让线程进入就绪状态并运行下一个线程 以下是课程: package operating_system; class TestScheduler extends Thread { public static void main(String [] args) { Sch

文件已经给出,我应该只编辑RoundRobinScheduler类中的块#2部分。 我尝试使用索引来安排每个线程。它按顺序成功运行,但无法作为“循环”调度从一个线程切换到另一个线程。 线程是否有任何函数可以让线程进入就绪状态并运行下一个线程

以下是课程:

package operating_system;

class TestScheduler extends Thread {

    public static void main(String [] args) {
        Scheduler mySched =  new RoundRobinScheduler();
                //new RandomScheduler() ;
        // or new RoundRobinScheduler() - when written
        // or new PriorityScheduler()  - when written
    Thread p1 = new SimProc(mySched, "Alan", 4) ;
    Thread p2 = new SimProc(mySched, "Brian", 4) ;
    Thread p3 = new SimProc(mySched, "Charles", 4) ; 
    Thread p4 = new SimProc(mySched, "Dave", 4) ;
    Thread p5 = new SimProc(mySched, "Edward", 4) ;
    Thread p6 = new SimProc(mySched, "Francis", 4) ;
    mySched.start() ;
    }

}

线程切换已经使用
Scheduler.nextSlice()
synchronized(nextRunner){nextRunner.notify();}
部分实现。 缺少的是,您实际上是在第一次启动SimProc对象:

SimProc nextRunner = processList.get( next );
if(nextRunner.isAlive()) {
  synchronized( nextRunner ){ nextRunner.notify();}
} else {
  nextRunner.start();
}

谢谢你的回复。但是,从结果来看,它按顺序安排,但仍然无法从thread1切换到thread2,并且。。。每次线程完成一个输出时。应该是这样的“这是艾伦。。。这是布莱恩…这是艾伦…这是布莱恩…“而不是”这是艾伦。。。这是艾伦…这是艾伦…这是布莱恩。。。这是大脑…’。
package operating_system;

import java.util.ArrayList ;

abstract public class Scheduler extends Thread {

protected ArrayList <SimProc> processList ;
    public Scheduler() {
      processList = new ArrayList <SimProc> () ;
    }

   public synchronized void addProcess(SimProc t) {
      processList.add(t) ;
   }

   public void endSlice(SimProc t) {
        synchronized(t) {
            synchronized(this) { notify() ; }
        try { t.wait() ;}
        catch (Exception e) { 
        System.out.println("Unexpected interrupt in endSlice " + e) ;
        }
    }
   }    

   public synchronized void removeProcess(SimProc t) {
    int i = processList.indexOf(t) ;
    processList.remove(i) ;
   }
}
package operating_system;

import java.util.Random ;

public class RoundRobinScheduler extends Scheduler {

private Random randGen ;

    public RoundRobinScheduler() {
         randGen = new Random() ;
    }

    public void removeProcess( int index ){
         processList.remove(index);
    }

    public synchronized void run() {
    while (true) {
     //BLOCK 1
        int noProcs = processList.size() ;
        if (noProcs == 0) System.exit(0) ;
     //BLOCK 2
        int curProcs = 0;
        int next;
        if ( curProcs == noProcs )
                next = 0;
        else next = curProcs++;
        SimProc nextRunner = processList.get( next );
        synchronized( nextRunner ){ nextRunner.notify();}
     //BLOCK 3
        try { wait() ;}
        catch (Exception e) { 
        System.out.println("Unexpected interrupt in run " + e) ; 
        }
        //removeProcess( curProcs );
    }
}
}
SimProc nextRunner = processList.get( next );
if(nextRunner.isAlive()) {
  synchronized( nextRunner ){ nextRunner.notify();}
} else {
  nextRunner.start();
}