N = input.nextInt();
System.out.println(\请输入总时间T:\ T = input.nextInt();
System.out.println(\请输入检查每个项目所需时间D:\ D = input.nextInt();
}while(S*K>M*N||S<0||K<0||M<0||N<0);
busy= new int[M]; count= new int[M]; Tnum= 0; r=new int[S];
for(int i=0;i busy[i]=0; count[i]=0; } Teacher tea[]= new Teacher[M]; for(int k=0;k tea[k]=new Teacher(k); } Student stu[]=new Student[S]; for(int k=0;k stu[k]=new Student(k); } System.out.println(\ for(int i=0;i count[i]=0; busy[i]=0; } start=System.currentTimeMillis(); for(int i=0;i tea[i].start(); } for(int i=0;i while(gettime()<=T); } } class Teacher extends Thread { int I;//第几个老师 public Teacher(int i){ I=i; } public synchronized void comein() { job.Tnum++; //教室中空闲老师人数加1 System.out.println(job.gettime()+\老师进入教室\ } public synchronized void leave() { job.Tnum--; this.stop(); } public void run() { this.comein(); while(job.count[I] { this.leave(); System.out.println(job.gettime()+\老师离开教室(已经检查够N个)\ else { if(job.busy[I]==0) { System.out.println(job.gettime()+\老师离开教室(剩下时间不足以检查一个项目))\ this.leave(); } //老师由于时间不够再查一个人,所以离开 } } } } class Student extends Thread { int I; int a=0; int visit[]=new int[job.K]; public Student(int i) {I=i;} public synchronized void comein() { System.out.println(job.gettime()+\ \学生进入教室\ public synchronized void leave() { System.out.println(job.gettime()+\ \学生离开教室\ this.stop(); } public void run() { if(job.gettime()>job.T-job.D) //剩余时间是否小于D //是,则学生离开 { System.out.println(job.gettime()+\ \学生离开教室(时间不足)\ this.stop(); //结束学生线程 } else { this.comein();//不是,学生进入教室 //System.out.println(Work.gettime()+\ } while(job.Tnum if(job.gettime()>=job.T-job.D) //等老师够,可是等;老师够的时候时间不够了 { System.out.println(job.gettime()+\学生离开教室(时间不够)\ this.stop(); } else synchronized(this){ { job.Tnum = job.Tnum - job.K; for(int j=0;j System.out.println(job.gettime()+\老师\检查\学生\ }} try{Thread.sleep(job.D);} catch(InterruptedException e) {}//检查学生 for(int j=0;j if(job.gettime()>job.T-job.D)//如果时间已经不够了,立即让老师离开(即让他们不可用)//离开不能同时 { System.out.println(job.gettime()+\老师\离开教室(时间不够).\ job.busy[visit[j]]=1; } } } this.leave(); } } 五、测试数据及其结果分析 输入数据:S=3.M=3,K=2,N=3,T=1000,D=200 系统为S=3个学生生成三个随机进入教室的时间: 单位是毫秒。 运行结果: 六、调试过程中的问题 1、程序中学生进入教室的时间是通过随机函数产生随机的,但是由于学生线程是依次产生的,如果先开始的学生线程的随机时间比较迟,后开始的学生线程的随机时间比较早,那么会导致先开始的学生线程没有开始时,把后面的学生线程都堵塞了。所以在这里通过对产生的随机时间从小到大排列,这样就可以避免这种问题。