Diferencia entre revisiones de «Discusión:Monitores»
De Wiki de Sistemas Operativos
(ejemplo en java) |
(Instrucciones para ejecutar el programa desde la línea de comandos) |
||
Línea 55: | Línea 55: | ||
</source> | </source> | ||
+ | |||
+ | Para ejecutar el programa desde la linea de comandos: | ||
+ | |||
+ | 1) Copiar todas las clases en un mismo archivo de texto y guardarlo como Principal.java | ||
+ | 2) Compilar el codigo con la instrucción "javac Princiapal.java" | ||
+ | 3) Ejecutar el archivo class creado con "java Principal" | ||
+ | 4) Para parar el programa usar "Control+c" |
Revisión del 14:06 22 nov 2011
Ejemplo en Java
Ejemplo de sincronización mediante monitores con 5 hilos que modifican dos variables. Cada hilo incrementa las dos variables una unidad. El hilo principal va mostrando el contenido de las variables. Si quitamos la clausula synchronized podemos ver como las variables no se incrementan a la vez.
public class Principal {
public static void main(String[]args){
RecursoCompartido c = new RecursoCompartido();
for(int i=0;i<5;i++){
new Hilo(c);
}
while(true){
c.mostrar();
try{
Thread.sleep(20);
}catch(InterruptedException e){}
}
}
}
class Hilo extends Thread{
static int i=0;
int h;
RecursoCompartido c;
public Hilo(RecursoCompartido c){
this.setDaemon(true);
this.c=c;
h=i++;
this.start();
}
public void run(){
while(true){
c.incrementar();
//System.out.println("Ahora se está ejecutando el hilo "+h);
try{
sleep(20);
}catch(InterruptedException e){
}
}
}
}
class RecursoCompartido{
private int a = 0;
private int b = 0;
public synchronized void incrementar(){
a++;
b++;
}
public void mostrar(){
System.out.println("a: "+a+"\tb: "+b);
}
}
Para ejecutar el programa desde la linea de comandos:
1) Copiar todas las clases en un mismo archivo de texto y guardarlo como Principal.java 2) Compilar el codigo con la instrucción "javac Princiapal.java" 3) Ejecutar el archivo class creado con "java Principal" 4) Para parar el programa usar "Control+c"