Лбораторне завдання (варіант 19)
Варіант 19. Програма моделює обслуговування двох потоків процесів з різними параметрами двома центральними процесором комп'ютера. Для кожного потоку задається своя черга. Процес з кожного потоку поступає на свій процесор, і лише у тому випадку, коли в своїй черзі немає процесу, процесор бере на обробку чужий процес. Визначте максимальний розмір для кожної з черг.
Текст програми результат виконання програми
class Process
public class Process {
String name;
Process(String str){
name = str;
}
String getName(){
return name;
}
}
class CPU2
public class CPU2 extends Thread{
public synchronized void run(){
while ((Source.first_ended == false) && (Source.first.isEmpty() == false)||(Source.second_ended == false) && (Source.second.isEmpty() == false)){
if (Source.second.isEmpty()== false){
System.out.println(Source.second.getProc().getName()+" worked by CPU2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (Source.first.isEmpty()==false){
System.out.println(Source.first.getProc().getName()+" worked by CPU2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class CPU1
public class CPU1 extends Thread {
public synchronized void run(){
while ((Source.first_ended == false) && (Source.first.isEmpty() == false)||(Source.second_ended == false) && (Source.second.isEmpty() == false)){
if (Source.first.isEmpty()== false){
System.out.println(Source.first.getProc().getName()+" worked by CPU1");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (Source.second.isEmpty()==false){
System.out.println(Source.second.getProc().getName()+" worked by CPU1");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class QUEUE
import java.util.Vector;
public class QUEUE {
Vector <Process> queue;
QUEUE(){
queue = new Vector<Process>();
}
public void addProc(Process tmp){
queue.add(tmp);
}
public Process getProc(){
Process tmp = queue.firstElement();
queue.remove(0);
return tmp;
}
public boolean isEmpty(){
return queue.isEmpty();
}
int countOfProc(){
return queue.size();
}
}
class SysTread
public class SysTread extends Thread{
private int count;
private int num;
SysTread (int CountProc, int numb){
count = CountProc;
num = numb;
}
public synchronized void run(){
if (num ==1){
for (int i = 0; i<count; ++i){
Process tmp = new Process("Process "+ i);
Source.first.addProc(tmp);
System.out.println(tmp.getName()+ " added in queue #" + num);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread "+ num+ "loaded, max size of queue="+Source.first.countOfProc());
Source.first_ended = true;
} else {
for (int i = 0; i<count; ++i){
Process tmp = new Process("Process "+ (i+1)*10);
Source.second.addProc(tmp);
System.out.println(tmp.getName()+ " added in queue #" + num);
try {
Thread.sleep(700);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread "+ num+ "loaded, max size of queue="+Source.second.countOfProc());
Source.second_ended = true;
}
}
}
class Source
public class Source {
public static boolean first_ended = false;
public static boolean second_ended = false;
public static QUEUE first = new QUEUE();
public static QUEUE second = new QUEUE();
public static void main (String[] args){
SysTread Thr1 = new SysTread(10,1);
SysTread Thr2 = new SysTread(6,2);
CPU1 cpu1 = new CPU1();
CPU2 cpu2 = new CPU2();
Thr1.start();
Thr2.start();
cpu1.start();
cpu2.start();
}
}