如何在使用Java的循环调度中将一个线程更改为另一个线程
文件已经给出,我应该只编辑RoundRobinScheduler类中的块#2部分。 我尝试使用索引来安排每个线程。它按顺序成功运行,但无法作为“循环”调度从一个线程切换到另一个线程。 线程是否有任何函数可以让线程进入就绪状态并运行下一个线程 以下是课程:如何在使用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
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();
}