dis/04/src/ClientThread.java

72 lines
2.1 KiB
Java

import java.util.concurrent.ThreadLocalRandom;
/**
* Represents a client.
*/
public class ClientThread extends Thread {
private int _id;
private int _lowerPageBound;
private int _upperPageBound;
private PersistenceManager _manager;
/**
* Initializes the thread.
* @param id the ID of this client
* @param lowerPageBound smalles page ID that can be accessed by this client
* @param upperPageBound highest page ID that can be accessed by this client
*/
ClientThread(int id, int lowerPageBound, int upperPageBound) {
_id = id;
_lowerPageBound = lowerPageBound;
_upperPageBound = upperPageBound;
_manager = PersistenceManager.getInstance();
}
/**
* Runs the thread.
*/
public void run() {
while(true) {
try {
int taid = beginTransaction();
int numberOfWrites = ThreadLocalRandom.current().nextInt(0, 10);
for (int i = 0; i < numberOfWrites; ++i) {
write(taid);
}
commit(taid);
} catch (InterruptedException e) {
return;
}
}
}
/**
* Begins a transaction and returns the transaction ID.
* @return new transaction ID
*/
private int beginTransaction() throws InterruptedException {
int taid = _manager.beginTransaction();
Thread.sleep(2000);
return taid;
}
/**
* Commits the given transaction.
* @param taid the transaction ID
*/
private void commit(int taid) throws InterruptedException {
_manager.commit(taid);
Thread.sleep(2000);
}
/**
* Performs a write.
* @param taid the transaction ID used for this write
*/
private void write(int taid) throws InterruptedException {
int pageID = ThreadLocalRandom.current().nextInt(_lowerPageBound, _upperPageBound + 1);
_manager.write(taid, pageID, "transaction " + taid + " of client " + _id);
Thread.sleep(2000);
}
}