elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1]
1  Programación / Java / Usar "static" en Concurrencia. ¿mala práctica? en: 6 Mayo 2018, 16:11 pm
"Esta cuestión es un tema que se trata mucho en los foros. A mí no me gusta nada la declaración static, ya que implica por un lado que puedes usar métodos de un a clase sin necesidad de declarar objetos de la propia clase, o bien la compartición directa de atributos para todas las instancias de una clase. Ambos comportamientos, a mi entender son un mal uso de la programación orientada a objetos, pero son permitidos en JAVA (como muchas otras cosas)." Mi profesor.
¿Qué opináis sobre nuestro amigo "static"?

Independientemente de las discrepancias que cada uno pueda tener con esta declaración, me encuentro en el siguiente caso:
Si habéis tratado con Java Concurrente, seguramente sabréis que es muy usual utilizar el ejemplo del "Cocinero y Cliente"/"Productor y consumidor", etc. para ejemplificar el uso práctico de la concurrencia en Java.

El siguiente código que voy a mostraros ahora utiliza la variable entera static "tarta" y un 'lock' para el bloque synchronized también static. Creo que la pregunta es evidente, ¿si el uso de "static" es, supuestamente, y para algunos, una mala práctica, cómo podríamos resola declaración static?una forma alternativa a usar la declaración static?
Código:
/*

 CONSUMIDOR:

 - Si hay tarta = Me como una

 - Si NO ... = Despertar COCINERO, dormir CONSUMIDOR.

 COCINERO:

 - Me duermo esperando a que un cliente me llame

 - Si me llama produzco 10 trozos de tarta, me duermo.

 */

public class Principal implements Runnable {

 

     private boolean consumidor;

     private static int tarta=0;

     private static Object lock = new Object();

   

     public Principal(boolean consumidor) {

          this.consumidor=consumidor;

     }

 

     public void run() {

          while(true) {

                if(consumidor) {

                     consumir();

                }else {

                     cocinar();

                }

          }

     }

   

     private void consumir() {

          synchronized(lock) { //Cerrojo

                if(tarta>0) { //SI QUEDAN TARTAS...

                     tarta--; //Comer una tarta

                     System.out.println("Quedan "+tarta+" porciones de tarta.");

                     try {

                          Thread.sleep(1000);

                     } catch (InterruptedException e) {

                          e.printStackTrace();

                     }

                }else { //SI NO QUEDAN TARTAS...

                     lock.notifyAll(); //Despertar a el COCINERO que esperaba (abrir cerrojo, dejar pasar)

                     try {

                          lock.wait(); //Dormir al consumidor (hasta que lo despierten)

                     } catch (InterruptedException e) {

                          e.printStackTrace();

                     }

                }

          }

     }

   

     private void cocinar() {

          synchronized (lock) {

                if(tarta==0) {

                     tarta=10; //Cocinar 10 trozos de tarta

                     System.out.println("Soy el cocinero y quedan "+tarta+" trozos.");

                     lock.notifyAll(); //"¡Chacho! Que las tartas están listas!", Vale tío.

                } try {

                     lock.wait(); //dormir

                }catch(Exception e) {}

          }

     }

   

     public static void main(String[] args) {

          int numHilos = 11;

         

          Thread[] hilo = new Thread[numHilos];

         

          for(int i=0; i<hilo.length; i++) {

                Runnable runnable = null;

               

                if(i !=0) {

                     runnable = new Principal(true);

                }else {

                     runnable = new Principal(false);

                }

               

                hilo[i] = new Thread(runnable);

                hilo[i].start();

          }

         

          for(int i=0; i<hilo.length; i++) {

                try {

                     hilo[i].join();

                }catch(Exception e) {}

          }

     }

}
2  Comunicaciones / Android / No se me conceden permisos RW para borrar apps preinstaladas con root en: 29 Abril 2018, 23:22 pm
Buenas noches. Tras rootear mi SM-J530F (Samsung Galaxy J5 2017) y flashearle el TWRP, todo va perfecto pero a la hora de intentar desinstalar apps preinstaladas en la rom Stock como el Facebook (por ejemplo).

Tengo el siguiente error: Rooteado, pero no puede conceder el permiso RW en la carpeta /system.
Aquí os dejo la screenshot:

Alguna idea?  :huh: :huh: :huh:
Saludos y muchas gracias.
3  Programación / Java / [DUDA] Problema al transformar Cº a Fº en un programa. en: 5 Agosto 2016, 13:23 pm
Hola a todos ::), primero me gustaría decir que soy nuevo en el foro y principiante de Java así que no me maten. :-\

Estaba creando un programa que me transformase los grados Celsius/Centígrados a Fahrenheit y viceversa. Al pasar de Cº a Fº la formula sería:

Fº = Cº * (9/5) + 32

Pero me dí cuenta que por ejemplo 35ºC son 95ºF (visto en Google) mientras que en mi programa da 67ºF.  :o

Esto quiere decir que en mi programa solo se sumaron los 32 de la formula pero no multiplicó los 9/5 por los Celsius. No entiendo por qué  :huh: así que les dejo el código:
Código:
package Experimentillos;
import java.util.Scanner;

public class FahrenheitCelsius {

static double Cº_Fº(double num){
num = num*(9/5)+32;
   return num;
}

static double Fº_Cº(double num){
num = (num-32)*(5/9);
   return num;
}

public static void main(String[] args){
Scanner S = new Scanner(System.in);

int op;
double celsius, fahren;

do{
System.out.println("Elija una opción: ");
System.out.println("1. Cº => Fº");
System.out.println("2. Fº => Cº");
System.out.println("3. Salir");
op = S.nextInt();
}while(op > 3 || op < 1);

switch(op){
case 1:
System.out.println("¿Cuántos Cº?");
celsius = S.nextInt();
fahren = Cº_Fº(celsius);
System.out.println(celsius+" Cº son "+fahren+" Fº.");
break;
case 2:
System.out.println("¿Cuántos Fº?");
fahren = S.nextInt();
celsius = Fº_Cº(fahren);
System.out.println(fahren+" Fº son "+celsius+" Cº.");
break;
case 3:
}
}
}

Gracias de antemano. Saludos!!!
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines