Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-0122 Sistemas operativos
Ejemplos
|
|
|
CI0122 /
Ejemplos
/ java |
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Random;
//A shared resource/class
class Shared {
AtomicInteger cH;
AtomicInteger cO;
Semaphore SemH;
Semaphore SemO;
public Shared() {
cH = new AtomicInteger(); // Inits variable in zero
cO = new AtomicInteger();
// creating a Semaphore object with number of permits 0
SemH = new Semaphore(0);
SemO = new Semaphore(0);
}
public int getH() {
return cH.get();
}
public int getO() {
return cO.get();
}
public void IncH() {
cH.getAndIncrement();
}
public void DecH() {
cH.getAndDecrement();
}
public void IncO() {
cO.incrementAndGet();
}
public void DecO() {
cO.decrementAndGet();
}
public void SignalH() {
this.SemH.release();
}
public void SignalO() {
this.SemO.release();
}
public void WaitH() {
try {
this.SemH.acquire();
} catch ( InterruptedException e ) {
}
}
public void WaitO() {
try {
this.SemO.acquire();
} catch ( InterruptedException e ) {
}
}
}
class Particle extends Thread {
Random r;
int number;
Shared resources;
public Particle( int i, Shared res ) {
this.number = i;
this.r = new Random();
this.resources = res;
}
@Override
public void run() {
if ( r.nextBoolean() ) { // Create a new particle, randomly select hydrogen and oxygen
System.out.println("Starting O thread " + this.number + " ... cO(" + resources.getO() + "), cH(" + resources.getH() + ")" );
this.O();
} else {
System.out.println("Starting H thread " + this.number + " ... cO(" + resources.getO() + "), cH(" + resources.getH() + ")" );
this.H();
}
}
public void O() {
if ( resources.getH() > 1 ) {
System.out.println("\t O particle making water :) ... cO(" + resources.getO() + "), cH(" + resources.getH() + ")" );
resources.DecH(); resources.DecH();
resources.SignalH();
resources.SignalH();
} else {
resources.IncO();
resources.WaitO();
}
}
public void H() {
if ( (resources.getH() > 0) && (resources.getO() > 0) ) {
System.out.println("\t H particle making water :) ... cO(" + resources.getO() + "), cH(" + resources.getH() + ")" );
resources.DecH();
resources.DecO();
resources.SignalH();
resources.SignalO();
} else {
resources.IncH();
resources.WaitH();
}
}
}
// Driver class
public class Agua {
public static void main(String args[]) throws InterruptedException {
Shared agua = new Shared();
Thread particles[] = new Thread[ 100 ];
for ( int i = 0; i < 100; i++ ) {
particles[ i ] = new Particle( i, agua );
particles[ i ].start();
}
// waiting for threads
for ( int i = 0; i < 100; i++ ) {
try {
particles[ i ].join();
} catch ( InterruptedException e) {
}
}
}
}