blackrabbit
Legacy Member
Howdy,
heb me (nog eens
) op Java & OO programming gestort, en zit nu met een vraagje ivm threading.
First things first: ik heb (als oefening) een programma geschreven dat liften bestuurd.
Object1: Lift => de lift zelve, stijgt en daalt, bevind zich op een bepaalde plaats en beweegt naar een andere (of net niet)
Object2: LiftControl => beheerder van de liften. Dit object selecteert welke lift op welke vraag moet antwoorden.
Object3: Main => ...
Main:
Lift:
LiftControl:
Implementatie (zeker van LiftControl => kiezen van lift) is nog niet af, maar het werkt wel.
Allemaal leuk dus, maar nu komt de vraag: stel dat Lift1 bezig is met bewegen, dan zal toch pas de 2de 'bestelling' behandeld worden wanneer Lift1 gedaan heeft.
De oplossing ligt volgens mij dus bij threads, alleen heb ik niet helemaal door hoe ik het precies moet implementeren...
Verder is commentaar op code ook welkom, ofcourse.
heb me (nog eens
) op Java & OO programming gestort, en zit nu met een vraagje ivm threading.First things first: ik heb (als oefening) een programma geschreven dat liften bestuurd.
Object1: Lift => de lift zelve, stijgt en daalt, bevind zich op een bepaalde plaats en beweegt naar een andere (of net niet)
Object2: LiftControl => beheerder van de liften. Dit object selecteert welke lift op welke vraag moet antwoorden.
Object3: Main => ...
Main:
PHP:
package elevator;
public class Main
{
public Main()
{
}
public static void main(String[] args)
{
LiftControl lift = new LiftControl(2);
lift.EditLift(0,10,0);
lift.OrderFloor(3,1);
}
}
Lift:
PHP:
package elevator;
public class Lift extends Thread{
public void run()
{
System.out.println("Thread '"+this.getName()+"' is waiting for input...");
}
public void start()
{
}
/** Creates a new instance of Lift */
public Lift(int LiftName) {
this.LiftNumber=LiftName;
floor = 0;
lamp = true;
door = true;
status = 0;
current_goto_floor=0;
max_floor = 1;
min_floor = 0;
System.out.println("Elevator "+LiftNumber+" built from floor "+min_floor+" up to floor "+max_floor);
}
public Lift(int max_floor, int min_floor)
{
this.max_floor=max_floor;
this.min_floor=min_floor;
System.out.println("Elevator "+LiftNumber+" expanded from floor "+min_floor+" up to floor "+max_floor+".\n\n");
}
public void OrderFloor(int goto_floor,int ordered_from_floor)
{
if(goto_floor>max_floor || goto_floor<min_floor || ordered_from_floor>max_floor || ordered_from_floor<min_floor)
{
System.out.println(">>ERROR: floor doesn't exist. Please try again! (Floor "+goto_floor+" ordered from floor "+ordered_from_floor+"; MAX:"+max_floor+", MIN:"+min_floor+")");
}
else
{
this.goto_floor=goto_floor;
this.ordered_from_floor=ordered_from_floor;
System.out.println("Lift "+LiftNumber+" ordered, please wait... (ordered on floor "+ordered_from_floor+", go to "+goto_floor+", current position:"+floor+")");
Move(ordered_from_floor);
// System.out.println("Lift moving to ordered floor ("+goto_floor+"), from this floor: "+floor);
Move(goto_floor);
}
}
protected int CurrentFloor()
{
return floor;
}
protected int GetStatus()
{
return status;
}
protected int MovingToFloor()
{
return current_goto_floor;
}
private void Move(int to_floor)
{
current_goto_floor=to_floor;
if(floor<to_floor)
{
while(floor<to_floor)
{
Up();
}
OpenDoor();
CloseDoor();
}
else if(floor>to_floor)
{
while(floor>to_floor)
{
Down();
}
OpenDoor();
CloseDoor();
}
else
{
CloseDoor();
}
}
private void OpenDoor()
{
System.out.println("Opening doors");
lamp = true;
door = true;
}
private void CloseDoor()
{
door = false;
System.out.println("Closing doors");
if(goto_floor == floor)
{
//wait 30s, then turn light off
lamp = false;
}
else
{
lamp = true;
}
}
private void moving()
{
try
{
sleep(1000);
}
catch (InterruptedException e)
{
}
}
private void Down()
{
status=-1;
floor = floor - 1;
System.out.println("Elevator "+LiftNumber+" moving 1 floor down, arriving at floor "+floor+".");
this.moving();
status=0;
}
private void Up()
{
status=1;
floor = floor + 1;
System.out.println("Elevator "+LiftNumber+" moving 1 floor up, arriving at floor "+floor+".");
this.moving();
status=0;
}
private boolean lamp; //true = on, false = off
private boolean door; //true = open, false = closed
private int floor;//floor lift is currently located
private int goto_floor;//floor the lift finally has to move to
private int current_goto_floor;
private int ordered_from_floor;//floor where the order was made
private int max_floor, min_floor;//highest and lowest floor
private int LiftNumber;//Number of this elevator, used for maintenance
private int status;//0=waiting for orders, -1=moving down, +1=moving up
}
LiftControl:
PHP:
package elevator;
/**
*
* This class creates the elevators and controls which elevator responds to what call.
*/
public class LiftControl {
public LiftControl(int lift_number)
{
this.number_of_lifts=lift_number;
liftarray=new Lift[number_of_lifts];
// String Threadname = "Lift"+Integer.toString(lift_number);
//new Lift(lift_number).start();
System.out.println("New system installed, supporting "+ number_of_lifts +" elevators.");
int i=0;
while(i < number_of_lifts)
{
liftarray[i]=new Lift(i);
i++;
}
System.out.println("END OF INITIALISATION.\n\n");
}
public void EditLift(int liftID,int max_floor, int min_floor)
{
System.out.println("Changing elevator "+liftID);
liftarray[liftID] = new Lift(max_floor,min_floor);
}
public void OrderFloor(int goto_floor, int ordered_from_floor)
{
System.out.println("LIFT ORDERED\nStatus: "+liftarray[0].GetStatus()+", Current Floor: "+liftarray[0].CurrentFloor()+", Moving to: "+liftarray[0].MovingToFloor()+".");
//here is were the magic happens
//this function select the most nearby elevator
boolean LiftFound=false;
int LiftID = 0;
if(LiftFound!=true)
{
//check if an idle elevator is located on the same floor
int i=0;
int[] CurrentLocations = this.GetFloors();
while( i < CurrentLocations.length)
{
if(i==liftarray[i].CurrentFloor())
{
OrderLift(i, goto_floor,ordered_from_floor);
LiftFound=true;
}
i++;
}
}
//CHECK floor difference between (1) and (2)
if(LiftFound!=true)
{
// 1
//find a (VERY) nearby elevator that is NOT moving.
int i=0;
int[] CurrentLocations = this.GetFloors();
while( i < CurrentLocations.length)
{
if(liftarray[i].GetStatus()==0)
{
OrderLift(i, goto_floor,ordered_from_floor);
LiftFound=true;
}
i++;
}
}
if(LiftFound!=true)
{
// 2
//find the most nearby elevator that is moving towards goto_floor AND ordered_from_floor
int i=0;
int[] CurrentLocations = this.GetFloors();
while( i < CurrentLocations.length)
{
//moving UP
if(liftarray[i].GetStatus()==1 && liftarray[i].CurrentFloor()<goto_floor && liftarray[i].MovingToFloor()>ordered_from_floor)
{
OrderLift(i, goto_floor,ordered_from_floor);
System.out.println("Found lift "+i+" moving up and passing by this floor.");
LiftFound=true;
}
i++;
}
}
}
private void OrderLift(int LiftID, int goto_floor, int ordered_from_floor)
{
//System.out.println("Elevator "+LiftID+" selected. Current location: "+liftarray[LiftID].CurrentFloor()+", ordered from "+ordered_from_floor+".");
liftarray[LiftID].OrderFloor(goto_floor, ordered_from_floor);
}
public void PrintLocations()
{
System.out.println("Current locations of elevators:");
int i = 0;
int[] CurrentLocations=this.GetFloors();
while(i<CurrentLocations.length)
{
System.out.println("Elevator "+i+" is located on floor "+CurrentLocations[i]);
i++;
}
}
private int[] GetFloors()
{
int[] CurrentFloorArray = new int[number_of_lifts];
int i=0;
while(i<number_of_lifts)
{
CurrentFloorArray[i]=liftarray[i].CurrentFloor();
i++;
}
return CurrentFloorArray;
}
private Lift[] liftarray;
private int number_of_lifts;
}
Implementatie (zeker van LiftControl => kiezen van lift) is nog niet af, maar het werkt wel.
Code:
New system installed, supporting 2 elevators.
Elevator 0 built from floor 0 up to floor 1
Elevator 1 built from floor 0 up to floor 1
END OF INITIALISATION.
Changing elevator 0
Elevator 0 expanded from floor 0 up to floor 10.
LIFT ORDERED
Status: 0, Current Floor: 0, Moving to: 0.
Lift 0 ordered, please wait... (ordered on floor 1, go to 3, current position:0)
Elevator 0 moving 1 floor up, arriving at floor 1.
Opening doors
Closing doors
Elevator 0 moving 1 floor up, arriving at floor 2.
Elevator 0 moving 1 floor up, arriving at floor 3.
Opening doors
Closing doors
Allemaal leuk dus, maar nu komt de vraag: stel dat Lift1 bezig is met bewegen, dan zal toch pas de 2de 'bestelling' behandeld worden wanneer Lift1 gedaan heeft.
De oplossing ligt volgens mij dus bij threads, alleen heb ik niet helemaal door hoe ik het precies moet implementeren...
Verder is commentaar op code ook welkom, ofcourse.



