Sei sulla pagina 1di 18

Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)

Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

Página 1
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

1 Introducción

!
" # $ %&" #' ! ( )* + *
(
, !
!
, -

!
./+0. ! !
, ( " $
- ( !
- (
$ ! ! &1 ' !
! 2
- ( 344 (
- 5 344
5
6 ! 344 !
7 7
! 2
- 7
!
!

Página 2
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

2 El entorno de desarrollo de Java: JCreator


8 7 ! ! & '
9 :
8 7 !

- + 7
8 7 ( !
!
. ( !

)
3 !
)
);;$$$ ;
3 !
)
);
; ;< ;= >?; $
6 7 & ' 3 &
@ ='

3 ! )

, 7
( (

, 5 & '

Página 3
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

, !
( )
(

, 5!
( !
! 7 5!
7
, (

- 5
!
& ' ! 7

, 7
(
7

- 5
! ! ! !
8
( $ %

- 5 ,
! " #$ -
5

, (
7 5" $
- 5 !
!

, " #$
!
) (

! ! +A +A !
7 & +A = >?'
8 5" %
7 !
7 5

- 5 !
3 . ! 5
+A

Página 4
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

6 7! 7 3 !
- 7 (

- 7 !
, 2
(
! 7
- + + 8
- 0 0
+ ! & ' ! (
( B'
-
)

class nombre_fichero{
public static void main (String [] args){
conjunto de instrucciones;
}
}

8 )
= 3 5( 5

< -

C - " 5

Página 5
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

D @ 7 7
5

E (

3 Sintaxis de Java
6 !
! ! 7 -
2 5 !
! .

2 ! !
- 8
)

class ejemploholamundo{
public static void main (String [] args){
String frase=”Hola Mundo”;
System.out.println(frase);
}
}

- ! )& ' *
$ 7 2
# ! =? )

class ejemploholamundo{
public static void main (String [] args){
String frase="Hola Mundo";
int i;
for (i=0; i<10; i++)
System.out.println(frase);
}
}

. ! !
#
+ ! 2
! 8 )

Página 6
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

class ejemploholamundo{
private int i;
public static void main (String [] args){
String frase="Hola Mundo";
for (i=0; i<10; i++)
System.out.println(frase);
}
}

. )

- ! ! (
FG 2 H, ), 2
6 2 ! ! ! (
5 ! 0
-
!
!
8 ! ! )
Clase CA
A
Atributo A
Atributo estático B
Método Op1{
A=1;
B=1;
}
Método Op1{
A=1;
B=1; Objeto O1
}
Método Estático Op2{
B=3; Compartido A
}

Método Op1{
A=1;
B=1;
B }

Método Op2{ Objeto O2


B=3
}

, "+ 2 , (
& ' ! I
2 , ( "+ . 5
"+ 2 2 !
2 , 8 ! 2
! ! , 5

2 2
8 !
)
• . ! - , ,./
• . ! - , ,./J - -./J , -./J - ,./J
, ,./

Página 7
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

8 ! )& ' *
)
class ejemploholamundo{
private static int i;
public static void main (String [] args){
String frase="Hola Mundo";
for (i=0; i<10; i++)
System.out.println(frase);
}
}

3.1 Declaración de clases en Java


3 3 7
2 ; !
- ! )
class nombre_clase [extends clasepadre]{
// Atributos
[private] [static] tipo atributo1;
[private] [static] tipo atributo2;

[private] [static] tipo atributoN;
//Métodos
[public][static] tipo metodo1 (lista_argumentos){
instrucciones;
}
[public][static] tipo metodo2 (lista_argumentos){
instrucciones;
}

[public][static] tipo metodoM (lista_argumentos){
instrucciones;
}
}

0 2 ! 8 2
6
7

# 2 5 # 5
5 ! ( 2
7
2 -
!
!
. 5 !
!
!
. 7
!
, )
private sin modificador protected public
Misma clase SI SI SI SI
Misma subclase de paquete NO SI SI SI
Misma no-subclase de paquete NO SI SI SI
Subclase de diferente paquete NO NO SI SI
No-subclase de diferente paquete NO NO NO SI

Página 8
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

3.2 Sintaxis de los métodos en Java


- 2 ( ! (
5 )
• 3 )
nombreclase (){…}

• 3 )
nombreclase(tipo arg1, tipo arg2, … , tipo argN){…}

• 2 ! )
[modificador] tipo nombre (tipo arg1, tipo arg2, … , tipo argN){…}

• 2 ! )
[modificador] tipo nombre (tipo arg1, tipo arg2, … , tipo argN){…}

• 2 ! )
[modificador] void nombre (){…}

• 2 ! )
[modificador] void nombre (){…}

• 3
8 (

3.3 Vectores y matrices en Java


8 7 ( )
tipo [] nombre;

8 )
tipo [][] nombre;

. 7!
7
. 7 7
2 )
nombre = new tipo[dimension];
nombre = new tipo[dimension1][dimension2]; 7

3.4 Ejemplo en Java


- ! 7 C× C

class matriz{
// Atributos
private int resultado;
private int [][] m;

// Métodos
matriz (){ // Inicialización de la matriz
m = new int[3][3];
m[0][0]=2; m[0][1]=10; m[0][2]=1;
m[1][0]=1; m[1][1]=2; m[1][2]=0;
m[2][0]=0; m[2][1]=2; m[2][2]=-1;
}

public void visualizarfila (int fila){ // Visualización de una fila


int i;
for (i=0; i<3; i++){
System.out.print(m[fila][i]);

Página 9
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

System.out.print(" ");
}
System.out.println("");
}
public int sumarfila (int fila){ // Suma de los elementos de una fila
int i;
int ac;
ac=0;
for (i=0; i<3; i++) ac=ac+m[fila][i];
return ac;
}
public void sumatotal (){ // Suma de todos los elementos de la matriz
int r1, r2, r3;
r1=sumarfila(0);
r2=sumarfila(1);
r3=sumarfila(2);
resultado=r1+r2+r3;
}
public void versuma(){ // Visualización de la suma
System.out.print("La suma es: ");
System.out.println(resultado);
}
public void visualizar (){
int i;
for (i=0; i<3; i++)
visualizarfila(i);
}
}

class ejemplomatricessecuencial{ // Clase que implementa el programa principal


public static void main (String [] args){
matriz ma = new matriz(); // Uso de una variable local
ma.sumatotal();
ma.visualizar();
ma.versuma();

}
}

, )

Página 10
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

4 Hilos en Java
3 !
2 !

- " $ & K>' , ( 6 (


!
7 !
!
!
6 !
! I
(
3 386
& '
! 386 !
! 386 (
3
& ' !
3
!
. ! ! !
( ! 6 (
! " $ KL

, !
(
, (
%
-
-

8 ! ! !
! ! !
! ! 5 -

! !
5 7
!

- (
& ' 2)

Página 11
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

Instrucciones concurrentes: HILOS

Nivel de planificación de los hilos: Puede estar


todo en el espacio de usuario o tener parte en
el espacio del Kernel.
Espacio de memoria
para los datos
Espacio de direcciones
P1 P2 P3 P4 P5

PROCESOS
Código

El usuario ejecuta el Planificación de procesos del


programa 1 tres veces y dos S.O.
veces el programa 2

// /// // // /// //
/// /// / /// /// /
// // / / // // / /
//// // //// //

Programa 1 Programa 2

4.1 Hilos en Java derivando de la clase Thread


- % & +A' Thread !
.! ! 7
7 7 2 run() !
Thread - 2 run() ( Thread 7
+ 2
2 start() !
Thread . !
Thread 2 start() & 7
' ! 2 run()

8 C1 C2 ( Thread O1 O2
C1 O3 O4 C2 3 )
O1.start();
O2.start();
O3.start();
O4.start();

, 2 run() C1 O1 O2
2 run() C2 O3 O4

1 )

Página 12
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

class hilo1 extends Thread{


public void run(){
System.out.println("Soy el hilo 1");
}

}
class hilo2 extends Thread{
public void run(){
System.out.println("Soy el hilo 2");
}

}
class interfazhilo3 implements Runnable{
public void run(){
System.out.println("Soy el hilo 3");
}
}
class ejemplo1{
public static void main (String [] args){

hilo1 h1=new hilo1();


hilo2 h2=new hilo2();
interfazhilo3 interfaz=new interfazhilo3();
Thread h3 = new Thread(interfaz);

h1.start();
h2.start();
h3.start();
}
}

. ! 7C
3 & '
- C Thread
! 7Runnable
Thread I 7 7
Runnable
-
! 2 run

class hilo extends Thread{


private int numero;
private int veces;

public void set_numero(int pnumero){


numero=pnumero;
}
public void set_veces(int pveces){
veces=pveces;
}
public void run (){
int i;
for (i=0; i<veces; i++){
System.out.println(numero);
}

}
}
class ejemplo2{
public static void main (String [] args){
hilo h1=new hilo();
hilo h2=new hilo();
h1.set_numero(1);
h2.set_numero(2);
h1.set_veces(10);
h2.set_veces(10);
h1.start();
h2.start();
}
}

Página 13
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

-
7)
class fila extends Thread{
private int [] f;
private int resultado;
fila(int [] f){
this.f=f;
}
public void run(){
resultado=0;
for (int i=0; i<3; i++)
resultado=resultado+f[i];
System.out.print("Resultado parcial");
System.out.println(resultado);
}
public int get_resultado(){
return resultado;
}

}
class matriz {
private int resultado;
private int [][] m;
private fila [] hilos_para_sumar;

matriz (){
// Reserva de espacio para la matriz
m = new int[3][3];
m[0][0]=2; m[0][1]=10; m[0][2]=1;
m[1][0]=1; m[1][1]=2; m[1][2]=0;
m[2][0]=0; m[2][1]=2; m[2][2]=-1;

// Reserva de espacio para el vector de hilos


hilos_para_sumar = new fila[3];
// Reserva de espacio para cada uno de los hilos
hilos_para_sumar[0] = new fila (m[0]);
hilos_para_sumar[1] = new fila (m[1]);
hilos_para_sumar[2] = new fila (m[2]);
}

public void visualizarfila (int fila){


int i;
for (i=0; i<3; i++){
System.out.print(m[fila][i]);
System.out.print(" ");
}
System.out.println("");
}

public void sumatotal (){


int i;
resultado=0;
for (i=0; i<3; i++)
hilos_para_sumar[i].start();

// El hilo principal debe esperar a que el resto acabe


try{
for (i=0; i<3; i++)
hilos_para_sumar[i].join();
}catch (InterruptedException e){};

for (i=0; i<3; i++)


resultado=resultado+hilos_para_sumar[i].get_resultado();
}

public void versuma(){


System.out.print("La suma es: ");
System.out.println(resultado);
}
public void visualizar (){
int i;
for (i=0; i<3; i++)
visualizarfila(i);
}
}

Página 14
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

class hilos{
public static void main (String [] args){
matriz ma = new matriz();
ma.sumatotal();
ma.visualizar();
ma.versuma();

}
}

- )
3 matriz
ma , 0 1 2 #
.1 /" 3 1 #
4 # 5 # $
6 % 1 1 $
4 + 1 2 3 6 4 3
03 3 3 $

Basura ma 100 ma

Referencia
en memoria
100
Tras la llamada
al metodo new

Instancia
de la
clase
matriz en
zona
dinámica

3 sumatotal C ! 7
, C !
M
for (i=0; i<3; i++)
hilos_para_sumar[i].start();
M

Hilo principal

Primera instrucción
del for
Hilo 1

Segunda instrucción
del for
Hilo 2

Tercera instrucción
del for
Hilo 3
Punto donde
concurren 4 hilos

join

El hilo principal debe quedar detenido hasta


que el resto acabe, porque el cálculo final
depende de los resultados parciales del
resto de los hilos.

Página 15
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

6 7! 7 sumatotal
7 3 2
visualizar !

4.2 El problema de la exclusión mutua resuelto con variables


compartidas
- .
7 !
- ( 3
! 2 ( .
! 2 run

! ! 2 ! (
( +
8 . !
! )
• E
• 1 7
8 )
• !
• 5 !
• 5 ! !
, 2 )
• 3 5
5 !
• 7 5
• 1 7 7
• 2 run Thread - !
run + % %

class hilo extends Thread{


private int [] v;
private int n;
private int numero;

public hilo (int [] v, int n, int numero){


this.n = n;
this.v = v;
this.numero = numero;
}
public void set_v (){
int i;
for (i = 0; i < n; i++)
v[i] = numero;
}
public void visualizar (){
int i;
for (i = 0; i < n; i++)
System.out.print(v[i]);
}
public void run (){
set_v();
visualizar();
}
}
class ejemploexclusionmutua1{
public static void main (String [] args){
int [] v = new int [100];
hilo h1 = new hilo (v, 100, 1);
hilo h2 = new hilo (v, 100, 2);

h1.start();
h2.start();
}
}

Página 16
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

3 2 main -
5 = 5 <
- 7 h1 h2 !

, ! = <
2 . !
! (
-
8 ##
!
2 ! ! 2
!

+ % !
);;
$$$ ( ; ;-" +;
!
5 8
7 + %% !
( <

( < !

4.2.1 Primer intento


- (
5 ! ! -
7! ! -
& 7 ' !

proceso p1 (int turno){ class turno{


… private static int t;
while (turno==2){} public static int get_turno(){
<seccion_critica> return (t);
… }
} public static void set_turno(int t){
proceso p2 (int turno){ turno.t=t;
… }
while (turno==1){} }
<seccion_critica> class hilo extends Thread{
… private int [] v;
} private int n;
main (){ private int numero;
int turno=1; private int numero_hilo;
a=new P1(turno);
b=new P2(turno); public hilo (int [] v,
COBEGIN int n, int numero, int numero_hilo){
a; this.n = n;
b; this.v = v;
COEND this.numero = numero;
} this.numero_hilo = numero_hilo;
}
public void set_v (){
int i;
for (i = 0; i < n; i++)
v[i] = numero;
}
public void visualizar (){
int i;
for (i = 0; i < n; i++)
System.out.print(v[i]);
}
public void run (){
while (turno.get_turno() !=
numero_hilo){};
set_v();
visualizar();
if (numero_hilo == 1)
turno.set_turno(2);

Página 17
Autora texto: Nieves Pavón Pulido Programación Concurrente (Manual de Java)
Profesores asignatura: Álvarez J.L., Márquez F.A., Pavón N., Rodríguez M.A.
http://www.uhu.es/17217-18216/ (Universidad de Huelva)

else turno.set_turno(1);
}
}

class ejemploexclusionmutua11{
public static void main (String [] args){
int [] v = new int [10];

turno.set_turno(1);

hilo h1 = new hilo (v, 10, 1, 1);


hilo h2 = new hilo (v, 10, 2, 2);

h1.start();
h2.start();
}
}

3 ! (
!
! !
! 6

Página 18

Potrebbero piacerti anche