//////////////////////////////////////////////////////////////////////////
//                                                                      //
//               CSE 428, Spring 2001, code for HW 4                    //
//                        File A4_code.java                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
//                                                                      //
//     Please compile and run the program under Unix (javac, java)      //
//                  Please don't modify this code.                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

import Scheduler;

// Main program

public class A4_code
{
    public static void main(String[] args) 
    {
        Scheduler s = new Scheduler(4);  // Schedule 4 tasks: 0, 1, 2, 3
 
        Agent mario = new Agent("Mario",0,s); // Mario performs task 0
        Agent luigi = new Agent("Luigi",0,s); // Luigi performs task 0
        Agent ariel = new Agent("Ariel",1,s); // Ariel performs task 1
        Agent beppe = new Agent("Beppe",2,s); // Beppe performs task 2
        Agent piera = new Agent("Piera",2,s); // Piera performs task 2
        Agent carlo = new Agent("Carlo",3,s); // Carlo performs task 3

        mario.start();
        luigi.start();
        ariel.start();
        beppe.start();
        piera.start();
        carlo.start();
    }
}

//////////////////////////////////////////////////////////////////////////

// Definition of agents

class Agent extends Thread 
{ 
    private String name;
    private int taskNumber;
    private Scheduler s;
     
    public Agent(String name, int n, Scheduler s)
    {
        this.name = name;
        this.taskNumber = n;
        this.s = s;
    }

    public void run()
    {
        try
        {
            for(;;)
            {
                s.requestPermissionToStart(name,taskNumber);

                sleep((long)(java.lang.Math.random()*1000)); // Perform task

                s.notifyEndOfTask(name,taskNumber);

                sleep((long)(java.lang.Math.random()*1000)); // Rest before starting task again
            }
        } catch (InterruptedException e) { return; }
    }
}
        

//////////////////////////////////////////////////////////////////////////

