Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Thread Race/nbproject/project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ main.class=main.frmMain
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=JDK_11
platform.active=JDK_16
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
Expand Down
52 changes: 37 additions & 15 deletions Thread Race/src/main/frmMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@
public class frmMain extends javax.swing.JFrame {

int contador = 1;
static final int N = 3;
int posicion = 0;
super_monitor monitor = new super_monitor();
// Procesos
Proceso hilo1;
Proceso hilo2;
Proceso hilo3;
// Región Crítica
int[] regionCritica = new int[3];
int posicion = 0;

/**
* Creates new form frmMain
Expand All @@ -33,9 +34,7 @@ public frmMain() {
this.hilo1 = new Proceso(lblNumeroHilo1);
this.hilo2 = new Proceso(lblNumeroHilo2);
this.hilo3 = new Proceso(lblNumeroHilo3);
regionCritica[0] = 0;
regionCritica[1] = 0;
regionCritica[2] = 0;

}

public class Proceso extends Thread {
Expand All @@ -53,15 +52,44 @@ public void run() {
// Operaciones pre región crítica
this.numeroAGenerar = (int)(Math.random()* 9 + 1);
this.miEtiqueta.setText(String.valueOf(numeroAGenerar));
// Región crítica
regionCritica[posicion] = this.numeroAGenerar;
monitor.insertar(numeroAGenerar);
System.out.println("Proceso finalizado con status: 0");
}
}
class super_monitor {
private int regionCritica[] = new int[N];
private int inf = 0, sup = 0; // contadores e índices
// monitor como solución
public super_monitor() {
regionCritica[0]=0;
regionCritica[1]=0;
regionCritica[2]=0;
}
/**
* synchronized = Una vez un hilo ha empezado a ejecutar ese método, no
* se permitirá que ningún otro hilo empiece a ejecutar ningún otro
* método synchronized de ese objeto
*/
public synchronized void insertar(int val) {
if (posicion == N) {
ir_a_estado_inactivo(); // si el búfer está lleno, pasa al estado inactivo
}
regionCritica[posicion] = val;
String contenidoRC = "[" + String.valueOf(regionCritica[0]) + "]";
contenidoRC += "[" + String.valueOf(regionCritica[1]) + "]";
contenidoRC += "[" + String.valueOf(regionCritica[2]) + "]";
lblRegionCritica.setText(contenidoRC);
posicion++;
// Operaciones post región crítica
System.out.println("Proceso finalizado con status: 0");
System.out.println(val + " ingresado");
if (posicion == 1) {
notify(); // si el consumidor estaba inactivo, lo despierta [signal]
}
}
private void ir_a_estado_inactivo() {
try {
wait(); // Duerme al proceso en turno
} catch (InterruptedException exc) {
};
}
}

Expand Down Expand Up @@ -211,12 +239,6 @@ private void btnIniciarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI
hilo1.start();
hilo2.start();
hilo3.start();
/*if (contador == 1)
hilo1.start();
if (contador == 2)
hilo2.start();
if (contador == 3)
hilo3.start();*/
contador++;
}//GEN-LAST:event_btnIniciarActionPerformed

Expand Down