[Threads] wait() y notify()

Iniciado por klaine, 14 Junio 2011, 23:43 PM

0 Miembros y 1 Visitante están viendo este tema.

klaine

De partida no es lo mismo agregar un nombre a un Thread que una variable identificadora o un contador o un valor booleano, etc... si vas a responder mi ultima pregunta te lo agradecere, pero lo que dices no tiene absolutamente nada que ver, y el codigo que pusiste si suelta error en tiempo de ejecucion por que no existe tal variable en la clase Thread, aunke pensandolo nisikiera es necesario hacer ese cast... y no me mandes a leer tutoriales por algo tan basico como pasar un argumento a la superclase, si no viste estoi preguntando otra cosa...

Saludos  ;)

Valkyr

Cita de: klaine en 22 Junio 2011, 08:00 AM
De partida no es lo mismo agregar un nombre a un Thread que una variable identificadora o un contador o un valor booleano, etc... si vas a responder mi ultima pregunta te lo agradecere, pero lo que dices no tiene absolutamente nada que ver, y el codigo que pusiste si suelta error en tiempo de ejecucion por que no existe tal variable en la clase Thread, aunke pensandolo nisikiera es necesario hacer ese cast... y no me mandes a leer tutoriales por algo tan basico como pasar un argumento a la superclase, si no viste estoi preguntando otra cosa...

Saludos  ;)

Vamos a ver, porque no estamos confundiendo. Si pongo este código en vez del anterior (el cual también compila y funciona perfectamente):

Código (javascript) [Seleccionar]
public class HiloSumador extends Thread {

private String identificador;
private int cantidad;

public HiloSumador(String id) {
super(id);
identificador = id;
cantidad = 0;
}

public void run() {
for (int i = 0; i < 20; i++)
cantidad++;
System.out.println("La suma es: " + cantidad);
System.out.println(identificador);
System.out.println(getName());
}

public static void main(String[] args) {
Thread hilo1 = new HiloSumador("Hilo1");
hilo1.start();
}

}


La salida por pantalla es:

La suma es: 20
Hilo1
Hilo1


Así que es lo mismo ponerle el nombre, que añadir una variable llamada "identificador" para llamar al hilo de alguna forma. ¿Qué no existe la variable y suelta error en tiempo de ejecución? Te vuelvo a decir que mires más cosas de Java, ¿como no va a existir una variable que te declaras como atributo de tu clase? Existen las dos, identificador y cantidad, porque las he declarado. Aunque haya herencia, yo estoy añadiendo los atributos que yo necesito para que mi hilo funcione. Así que no entiendo de donde te has sacado que falla en tiempo de ejecución por un lado, y que no existe esa variable por otro.

No se a que te refieres con eso de cast, si te refieres a "casting" yo no veo ninguno en el código así que...será otra cosa a lo que te refieres.

Por último ya te he respondido a tu pregunta:
Cita de: klaine en 21 Junio 2011, 23:40 PM
Heredando en runnable de Thread e implementando Runnable, hay otra forma?

Se puede hacer como te he mostrado en este código y en el anterior (que es la misma forma). No tiene sentido (y que me corrijan por favor si me equivoco alguien que lea esto) heredar de Thread, e implementar la interfaz Runnable, ya que si te vas y miras un poco la documentación de Thread: http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html verás que pone "All implemented interfaces: Runnable".

Siendo más sencillo, a tu pregunta respondo: Sí, se puede hacer de dos formas. Heredando de Thread e implmentando el método run(). O implementando la interfaz Runnable e implementando el método Run.

Saludos  ;)

klaine

Pensansolo bien funciona, pero no instanciandolo de la forma que dijiste, por eso me confundí

Thread t=new HiloSumador();

Al mostrar t.identificador (habiendolo cambiado a public) muestra, no existe la variable identificador en java.lang.Thread XP

Bueno, gracias de todos modos, saludos

Valkyr

No he probado eso que dices de ponerlo a public y mostrarlo así, pero vamos, eso es una tontería porque si quieres acceder a algún atributo de la clase, declaras su método get y punto. Además, es lógico que falle porque cuando intentas acceder a un atributo de clase directamente se hace por su parte estática y no dinámica, y evidentemente la clase Thread no tiene un atributo llamado identificador. Asíais si lo que quieres hacer es poner atributos a public esta forma fallaría, pero vamos, en el 99,9% de los casos se recomienda declaralos privare.

Además, todo lo que he intentado explicaste ha sido lo que he aprendido en una asignatura de programación concurrente y distribuida, azoque puedo asegurarte que esta bien.

Saludos