Есть некая задача смоделировать процессы ОС. Суть в том что нужно сделать 2 потока которые генерируют процесы(В моем случае числа) Код | import java.util.Random;
/** * Created by IntelliJ IDEA. * User: Администратор * Date: 17.01.2010 * Time: 11:04:40 * To change this template use File | Settings | File Templates. */ public class Proccess extends Thread{
private int numberProccess =0; //номер процесса private int proccessed1=0,destroyed=0; //количество уничтожених и успешных процессов private boolean run=true; public volatile boolean proccessed=false; //исполнился ли процесс public int getNumber(){ return this.numberProccess; }
public Proccess(int numberProccess,String name) { this.numberProccess = numberProccess;
this.setName(name);
}
public boolean isRun() { return run; }
public void setRun(boolean run) { this.run=run; } public void run(){ System.out.println("Start " +this.getName()+ " proccess"); while(run){
for(int i=0;i<numberProccess;i++) { System.out.println(this.getName()+" :generated "+i); //Генерирую процесс proccessed=false; //Он не завершился try { Thread.sleep((long) (Math.random()*1000)); //Жду } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. }
if(proccessed=true) {proccessed1++;proccessed=false;} else destroyed++; // (обычние счетчики)
}
this.setRun(false); System.out.println(this.getName()+" proccessed :"+proccessed1 +" Destroyed :"+destroyed); //Результаты
} }
}
|
Также я смоделировал процессор который обрабатывает потоки Код | /** * Created by IntelliJ IDEA. * User: Администратор * Date: 17.01.2010 * Time: 11:05:00 * To change this template use File | Settings | File Templates. */ public class CPU extends Thread{ private Proccess first,second;
public CPU(Proccess first, Proccess second) { this.first = first; this.second = second; first.setPriority(Thread.MAX_PRIORITY); //Эта для теста first.start(); //запускаем поток 1 second.start(); }
public void run() { while (first.isAlive() || second.isAlive()) { try {
first.proccessed=true //исполнить процес первого потока ; System.out.println(first.getName()+" proccessed "+first.getNumber()); Thread.sleep((long) (Math.random()*8000)); //Подождать second.proccessed=true; //Исполнить процес второго потока System.out.println(second.getName()+" proccessed "+second.getNumber());
} catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } }
} }
|
Код | /** * Created by IntelliJ IDEA. * User: Администратор * Date: 17.01.2010 * Time: 11:04:24 * To change this template use File | Settings | File Templates. */ public class Main { public static void main(String[] args){ Proccess ft=new Proccess(5, "First"); Proccess st=new Proccess(5, "Second"); CPU cpu=new CPU(ft,st); cpu.run();
} }
|
Если у потоков которые генерируют процессы задержка намного меньше а у потока который их обрабатывает она побольше то почему результаты такие, ни один процес не уничтожается. Код | First proccessed 5 Start First proccess First :generated 0 Start Second proccess Second :generated 0 First :generated 1 First :generated 2 Second :generated 1 First :generated 3 Second proccessed 5 First proccessed 5 Second :generated 2 Second :generated 3 First :generated 4 Second :generated 4 Second proccessed :5 Destroyed :0 First proccessed :5 Destroyed :0 Second proccessed 5
|
--------------------
 Челябинские программисты настолько суровы, что обходятся без компиляторов. Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
|