Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //TESTMAIN
- import java.lang.reflect.Array;
- import java.util.*;
- public class TestMain {
- public static void main(String[] args){
- int j=0;
- Random random= new Random();
- Scanner tastiera= new Scanner(System.in);
- int b,g,r;
- System.out.println("INSERIRE IL NUMERO DI PAZIENTI CON CODICE BIANCO");
- b=tastiera.nextInt();
- System.out.println("INSERIRE IL NUMERO DI PAZIENTI CON CODICE GIALLO");
- g=tastiera.nextInt();
- System.out.println("INSERIRE IL NUMERO DI PAZIENTI CON CODICE ROSSO");
- r=tastiera.nextInt();
- Medico[] medici=new Medico[10];
- PriorityQueue<Thread> pazienti=new PriorityQueue<>(g + r, new Comparator<Thread>() {
- @Override
- public int compare(Thread thread, Thread t1) {
- return t1.getPriority()-thread.getPriority();
- }
- });
- ArrayList<Thread> rossi=new ArrayList<>(r);
- for(int i=0;i<10;i++){
- Medico m=new Medico(i,pazienti,rossi);
- medici[i]=m;
- }
- for(int i=0;i<r;i++) {
- int k = random.nextInt(5) + 1;
- Paziente p = new Paziente(i, 3, k, -1, medici,pazienti,rossi);
- Thread thread = new Thread(p);
- thread.setPriority(3);
- rossi.add(thread);
- thread.start();
- }
- for(int i=0;i<g;i++){
- j=i%10;
- int k=random.nextInt(5)+1;
- Paziente p = new Paziente(i, 2, k, j,medici,pazienti,rossi);
- Thread thread = new Thread(p);
- thread.setPriority(2);
- pazienti.add(thread);
- thread.start();
- }
- for(int i=0;i<b;i++){
- int k=random.nextInt(5)+1;
- Paziente p = new Paziente(i, 1, k, random.nextInt(9),medici,pazienti,rossi);
- Thread thread = new Thread(p);
- thread.setPriority(1);
- pazienti.add(thread);
- thread.start();
- }
- }
- }
- //MEDICO
- import java.awt.image.AreaAveragingScaleFilter;
- import java.util.ArrayList;
- import java.util.PriorityQueue;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class Medico {
- private int id;
- private Lock lockMedico=null;
- private Condition isBusy=null;
- private PriorityQueue<Thread> pazienti;
- private ArrayList<Thread> rossi;
- public Medico(int id,PriorityQueue<Thread> pazienti,ArrayList<Thread> rossi){
- this.id=id;
- lockMedico=new ReentrantLock();
- isBusy= lockMedico.newCondition();
- this.pazienti=pazienti;
- this.rossi=rossi;
- }
- public void lockTotale(){
- lockMedico.lock();
- }
- public void unlockTotale(){
- lockMedico.unlock();
- }
- public void signalTotale(){
- isBusy.signal();
- }
- public void visita(){
- if(Thread.currentThread().getPriority()!=3)lockMedico.lock();
- try{
- try{
- while((rossi.size()!=0 && Thread.currentThread().getPriority()==1)){
- isBusy.await();
- }
- while(rossi.size()!=0 && Thread.currentThread().getPriority()==2){
- isBusy.await();
- }
- }
- catch(Exception e){
- e.printStackTrace();
- }
- try {
- System.out.println("Thread "+ Thread.currentThread().getId()+" di priorità "+Thread.currentThread().getPriority()+" con medico "+id);
- Thread.sleep(100);
- isBusy.signal();
- }
- catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- finally{
- System.out.println("Thread "+ Thread.currentThread().getId()+" con medico FINITA "+id);
- if(Thread.currentThread().getPriority()!=3) lockMedico.unlock();
- }
- }
- }
- //PAZIENTE
- import java.util.*;
- import java.util.concurrent.locks.Condition;
- public class Paziente extends Thread {
- private int id;
- private int codice;
- private int numeroVisite;
- private int medico;
- private Medico[] queue = null;
- private PriorityQueue<Thread> patients = null;
- private ArrayList<Thread> rossi=null;
- private Condition isBusy;
- public Paziente(int id, int codice, int numeroVisite, int medico, Medico[] queue, PriorityQueue<Thread> patients,ArrayList<Thread> rossi) {
- this.id = id;
- this.codice = codice;
- this.numeroVisite = numeroVisite;
- this.medico = medico;
- this.queue = queue;
- this.patients = patients;
- this.rossi=rossi;
- }
- public void run() {
- while(numeroVisite>0){
- if (codice == 1) {
- queue[medico].visita();
- }
- else if (codice == 2) {
- queue[medico].visita();
- }
- else {
- for(int i=0;i<10;i++)
- queue[i].lockTotale();
- for(int i=0;i<10;i++)
- queue[i].visita();
- for(int i=0;i<10;i++)
- queue[i].signalTotale();
- for(int i=0;i<10;i++)
- queue[i].unlockTotale();
- }
- numeroVisite--;
- if(numeroVisite==0 && Thread.currentThread().getPriority()!=3){
- patients.poll();
- }
- else if(numeroVisite==0 && Thread.currentThread().getPriority()==3)
- rossi.remove(0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement