Java - Hilos multiples en una misma clase.

 
Vista:
sin imagen de perfil

Hilos multiples en una misma clase.

Publicado por Javier (14 intervenciones) el 26/03/2022 13:50:10
Hola amigos, hago este post por que tengo una pregunta sobre un codigo que es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Principal{
 
    public String Cadena = "Cadena de prueba 1";
 
    Thread TrUno = new Thread(){
        public void run(){
        }
    };
 
    Thread TrDos = new Thread(){
        public void run(){
        }
    };
 
 
    public Principal(){
       TrUno.start();
       TrDos.start();
   }
 
 
    public static void main(String[] args){
         Principal P = new Principal();
    }
 
 
}


Como pueden ver tengo una clase principal "Principal", dentro de esta clase se crean dos Threads "TrUno" y "TrDos", tambien esta el constructor de la clase que solo lo que hace es iniciar los dos hilos (Threads) y luego por ultimo tengo una variable del tipo string llamada "Cadena" que solo tiene una oracion de prueba dentro y mi pregunta sería ¿Cómo puedo hacer para acceder a la variable "Cadena" desde dentro de los hilos "TrUno" y "TrDos"?, es decir desde el metodo run de cada hilo.
Eso es todo, adiós.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Hilos multiples en una misma clase.

Publicado por Kabuto (1381 intervenciones) el 26/03/2022 20:55:56
¿Quién dice que no puedas?
La cadena está declarada como atributo de ámbito global dentro de la clase, así que no deberías tener problema en acceder a ella.
Inténtalo y verás.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hilos multiples en una misma clase.

Publicado por Javier (14 intervenciones) el 27/03/2022 01:37:39
Ya lo intente poniendo this.Cadena dentro del metodo run y no la reconoce. O deberia hacer otra cosa?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Hilos multiples en una misma clase.

Publicado por Yamil Bracho (2315 intervenciones) el 27/03/2022 03:48:32
Lo unico que tienes que tener en cuenta es el acceso de varias tareas a un recurso si lo vas a actualizar, como se muestra aqui

public class Principal {

public String Cadena = "Cadena de prueba 1\n";

Thread TrUno = new Thread(){
public void run(){
synchronized (this) {
Cadena += "Hello from Thread 1\n";
}
}
};

Thread TrDos = new Thread(){
public void run(){
synchronized (this) {
Cadena += "Hello from Thread 2";
}
}
};

public void start() {
try {
TrUno.start();
TrDos.start();
Thread.sleep(2000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

public static void main(String []args){

Principal p = new Principal();
p.start();

System.out.println("En main Cadena=" + p.Cadena);
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hilos multiples en una misma clase.

Publicado por Javier (14 intervenciones) el 27/03/2022 15:55:31
Estuve leyendo sobre synchronized y lei que el bloque synchronized lleva entre paréntesis la referencia a un objeto . Cada vez que un thread intenta acceder a un bloque sincronizado le pregunta a ese objeto si no hay algún otro thread que ya tenga el lock para ese objecto, en otras palabras, le pregunta si no hay otro thread ejecutando algun bloque sincronizado con ese objeto


Fuente: https://epere4.blogspot.com/2008/04/cmo-funciona-synchronized-en-java.html

Viendo tu ejemplo veo que tu pones la palabra "this" como parametro de synchronized y ese this hace referencia al hilo es sí y se deberia hacer referencia a una instancia de la clase Principal ya que ahi estan las variables que usaran los hilos, bueno mira este codigo y dime si estoy errado en lo que pienso:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Principal {
        public Principal self = this;
	public String Cadena = "Cadena de prueba 1\n";
 
	Thread TrUno = new Thread(){
		public void run(){
			synchronized (self) {
			Cadena += "Hello from Thread 1\n";
			}
		}
	};
 
	Thread TrDos = new Thread(){
		public void run(){
			synchronized (self) {
			Cadena += "Hello from Thread 2";
			}
		}
	};
 
	public void start() {
		try {
			TrUno.start();
			TrDos.start();
			Thread.sleep(2000);
		} catch(InterruptedException ex) {
			Thread.currentThread().interrupt();
		}
	}
 
	public static void main(String []args){
 
		Principal p = new Principal();
		p.start();
 
		System.out.println("En main Cadena=" + p.Cadena);
	}
}


Lo que hice es agregar la propiedad self que apunta al mismo objeto, se apunta a si mismo y luego pasarla como parametro en synchronized, esta bien hecho eso? Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Hilos multiples en una misma clase.

Publicado por Kabuto (1381 intervenciones) el 27/03/2022 13:15:17
No uses this.

Si haces algo como esto:
1
2
3
4
5
6
Thread TrDos = new Thread(){
        public void run(){
        	System.out.println("Soy 2");
        	System.out.println(this.Cadena);
        }
    };

Ese this, no hace referencia a la clase Principal. Está haciendo referencia a la clase TrDos, ya que en realidad ahí estamos (sobre)escribiendo el código de una clase.

Ponlo sin this, tal cuál, y no debería haber ningún problema de visibilidad para que el método run() pueda acceder al String Cadena.

1
2
3
4
5
6
Thread TrDos = new Thread(){
        public void run(){
        	System.out.println("Soy 2");
        	System.out.println(Cadena);
        }
    };


Por otra parte, como bien ha apuntado Yamil, es importante gestionar la sincronía entre hilos en el caso de que quieras modificar esa cadena.
Si solo vas a mostrarla por pantalla, o algo similar, no es tan importante. Pero si se va a modificar, entonces sí.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hilos multiples en una misma clase.

Publicado por Javier (14 intervenciones) el 27/03/2022 13:24:07
Muchas Gracias por tus respuestas ya solucione el problema, ademas aprendi con eso de "synchronized", acaso no seria lo mismo poner "volatile" a la variable?

ahora tengo otro problema, estoy usando sockets y envio una cadena desde un cliente al servidor y luego imprimo la cadena en la consola del servidor el problema es que si envio una cadena con espacios me imprime cada palabra por separado, por ejemplo si yo envio desde el cliente
"hola que tal" en la consola del servidor se imprime:
Hola
que
tal

el lugar de:
Hola que tal.

Para enviar los datos desde el cliente uso el metodo writeUTF() de la clase DataOutputStream y para leer los datos desde el servidor uso readUTF() de la clase DataInputStream

que podra ser?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar