There are Four players numbered 0, 1, 2, 3 Four batteries numbered 0, 1, 2, 3 Fo
ID: 3537722 • Letter: T
Question
There are
Four players numbered 0, 1, 2, 3
Four batteries numbered 0, 1, 2, 3
Four game consoles numbered 0, 1, 2, 3
For each i=0, 1, 2, 3, player i has access to game console i as well as batteries i and (i+1) mod 4
For each i=0, 1, 2, 3, player i may
install batteries i and (i+1) mod 4 into game console i
Play on game console i, thus discharging each of batteries i and (i+1) mod 4 once
Put batteries i and (i+1) mod 4 back on the table
A battery cannot be simultaneously installed into two distinct game consoles
For each i=0, 1, 2, 3, player i quits precisely when at least one of batteries i and (i+1) mod 4 is completely discharged
Requirements
1.Do NOT modify TestPlay.java
2.I will do the following several times:
javac TestPlay.java Homework2.java
java TestPlay
3.If every run takes less than 5 seconds on my computer and there are no error messages, then your program passes the test
4.I may modify the arguments passed by your program%u2019s invocations to Thread.sleep
5.I may add to your program a few try-catch blocks containing invocations to Thread.sleep
Each such invocation will pass small arguments
6.Then I will retest your program in the aforementioned way
//please modify only class Homework2 implements Runnable
import java.util.Random;
final class Battery
{
private int capacity;
private final int number;
private boolean occupied;
public Battery(int capacity, int number)
{
this.capacity = capacity;
this.number = number;
}
public int getCapacity()
{
return capacity;
}
public int getNumber()
{
return number;
}
public boolean isOccupied()
{
return occupied;
}
public void setOccupied(boolean occupied)
{
this.occupied = occupied;
}
public void discharge()
{
try
{
int temp = capacity;
Thread.sleep(0, new Random().nextInt(1) + 1);
capacity = temp - 1;
} catch (InterruptedException e)
{
System.err.println("Error: Interrupted");
}
}
}
final class GameConsole
{
private int timesPlayed;
public int getTimesPlayed()
{
return timesPlayed;
}
public void play(Battery batt1, Battery batt2)
{
batt1.discharge();
batt2.discharge();
timesPlayed++;
}
}
public class TestPlay
{
public static final int BATTERY_CAPACITY = 6;
public static final int NUM = 4;
private final Battery[] batts = new Battery[NUM];
private final GameConsole[] cons = new GameConsole[NUM];
private final Thread[] thrs = new Thread[NUM];
public TestPlay() throws InterruptedException
{
int usedCapacity = 0;
int totalTimesPlayed = 0;
for (int i = 0; i < NUM; ++i)
{
batts[i] = new Battery(BATTERY_CAPACITY, i);
cons[i] = new GameConsole();
}
for (int i = 0; i < NUM; ++i)
{
thrs[i] = new Thread((Runnable)new Homework2(batts[i], batts[(i+1)%NUM], cons[i]));
thrs[i].start();
}
for (int i = 0; i < NUM; ++i)
{
thrs[i].join();
}
for (int i = 0; i < NUM; ++i)
{
usedCapacity += BATTERY_CAPACITY - batts[i].getCapacity();
totalTimesPlayed += cons[i].getTimesPlayed();
if (batts[i].getCapacity() < 0)
System.err.println("Error: Battery " + i + " has negative capacity");
if (batts[i].getCapacity() > 0 && batts[(i+1) % NUM].getCapacity() > 0)
System.err.println("Error: Battery power remain for player " + i);
}
if (usedCapacity != 2 * totalTimesPlayed)
System.err.println("Error: Remaining battery power incorrect");
}
public static void main(String[] args) throws InterruptedException
{
System.out.println("Starting the test...");
new TestPlay();
System.out.println("Tested!");
System.out.println("");
}
}
//please modify codes below
class Homework2 implements Runnable
{
Battery batt1;
Battery batt2;
GameConsole cons;
public Homework2(Battery batt1, Battery batt2, GameConsole cons)
{
this.batt1 = batt1;
this.batt2 = batt2;
this.cons = cons;
}
public void run()
{
boolean flag = true;
while( flag )
{
synchronized (batt1)
{
synchronized (batt2)
{
if (batt1.getCapacity() > 0 && batt2.getCapacity() > 0)
cons.play(batt1, batt2);
else
flag = false;
}
}
}
}
}
Explanation / Answer
Whats the problem? it works fine. Just have to make small changes at places as per the points 4,5 and 6. Comment what problem you are facing.
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.