Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Programación Concurrente en Java: Ejercicios y Ejemplos, Ejercicios de Matemáticas

Una serie de ejercicios y ejemplos de código en java que ilustran conceptos clave de la programación concurrente, como la creación de hilos, la sincronización y el patrón productor-consumidor. Los ejemplos abarcan desde la creación de hilos simples hasta la implementación de mecanismos de sincronización para evitar condiciones de carrera.

Tipo: Ejercicios

2024/2025

Subido el 06/02/2025

ronald-guachalla-calsina
ronald-guachalla-calsina 🇧🇴

2 documentos

1 / 11

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Ejemplo0: Mostrar el texto “Proceso 1” y diez veces y el texto “Proceso 2” " diez veces.
Utilizar la programación secuencial vista hasta ahora.
Sin hilos
Con hilos con clases independientes
public class MostrarMensaje {
public void mostrarM1() {
for (int f = 1; f <= 100; f++)
System.out.print("Proceso 1");
}
public void mostrarM2() {
for (int f = 1; f <= 100; f++)
System.out.print("Proceso 1");
}
}
public class Principal {
public static void main(String[] args) {
MostrarMensaje m=new MostrarMensaje();
m.mostrarM1();
System.out.println(" ");
m.mostrarM2();
}
}
public class Proceso1 extends Thread{
public Proceso1() {
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("Proceso 1 ");
}
}
}
public class Proceso2 implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("Proceso 2 ");
}
}
}
public class Principal {
public static void main(String[] args) {
Proceso1 hilo1=new Proceso1();
Thread hilo2=new Thread ( new Proceso2());
//Ejecucion de los hilos
hilo1.start();
hilo2.start();
}
}
pf3
pf4
pf5
pf8
pf9
pfa

Vista previa parcial del texto

¡Descarga Programación Concurrente en Java: Ejercicios y Ejemplos y más Ejercicios en PDF de Matemáticas solo en Docsity!

Ejemplo0: Mostrar el texto “Proceso 1” y diez veces y el texto “Proceso 2” " diez veces.

Utilizar la programación secuencial vista hasta ahora.

Sin hilos

Con hilos con clases independientes

public class MostrarMensaje { public void mostrarM1() { for (int f = 1; f <= 100; f++) System.out.print("Proceso 1"); } public void mostrarM2() { for (int f = 1; f <= 100; f++) System.out.print("Proceso 1"); } } public class Principal { public static void main(String[] args) { MostrarMensaje m= new MostrarMensaje(); m.mostrarM1(); System.out.println(" "); m.mostrarM2(); } } public class Proceso1 extends Thread{ public Proceso1() { } @Override public void run() { for (int i=0;i<10;i++){ System.out.println("Proceso 1 "); } } } public class Proceso2 implements Runnable{ @Override public void run() { for (int i=0;i<10;i++){ System.out.println("Proceso 2 "); } } } public class Principal { public static void main(String[] args) { Proceso1 hilo1= new Proceso1(); Thread hilo2= new Thread ( new Proceso2()); //Ejecucion de los hilos hilo1.start(); hilo2.start(); }

Eljemplo1: Mostrar el número "0" mil veces y el número "1" mil veces. Utilizar la

programación secuencial vista hasta ahora.

Sin Hilos

Con Hilos

public class MostrarCeroUno { public void mostrar0() { for (int f = 1; f <= 100; f++) System.out.print("0-"); } public void mostrar1() { for (int f = 1; f <= 100; f++) System.out.print("1-"); } } public class Principal { public static void main(String[] args) { MostrarCeroUno m= new MostrarCeroUno(); m.mostrar0(); System.out.println(" "); m.mostrar1(); } } public class HiloMostrarCero extends Thread { @Override public void run() { for (int f = 1; f <= 1000; f++) System.out.print("0-"); } } public class HiloMostrarUno extends Thread{ @Override public void run() { for (int f = 1; f <= 1000; f++) System.out.print("1-"); } } public class Prinicpal { public static void main(String[] args) { HiloMostrarCero h1 = new HiloMostrarCero(); h1.start(); HiloMostrarUno h2 = new HiloMostrarUno(); h2.start(); }

Ejercicio 2: Múltiples Contadores

Enunciado : Modifica el ejercicio anterior para que haya tres contadores, cada uno en su

propio hilo. Cada contador debe imprimir los números del 1 al 5, pero con un retraso

diferente entre cada número (por ejemplo, 1 segundo, 2 segundos y 3 segundos). Asegúrate

de que cada hilo imprima su propio nombre para identificar cuál está ejecutando.

Solución :

class Contador implements Runnable { private String nombre; private int retraso; public Contador(String nombre, int retraso) { this .nombre = nombre; this .retraso = retraso; } public void run() { for (int i = 1; i <= 5; i++) { System.out.println(nombre + ": " + i); try { Thread.sleep(retraso); // Pausa según el retraso } catch (InterruptedException e) { System.out.println(nombre + " interrumpido"); } } } } public class EjemploMultiplesContadores { public static void main(String[] args) { Thread hilo1 = new Thread( new Contador("Contador 1", 1000)); // 1 segundo Thread hilo2 = new Thread( new Contador("Contador 2", 2000)); // 2 segundos Thread hilo3 = new Thread( new Contador("Contador 3", 3000)); // 3 segundos hilo1.start(); hilo2.start(); hilo3.start(); }

Ejercicio 3: Suma Concurrente

Enunciado : Crea una clase llamada Suma que implemente Runnable. Esta clase debe

tener un método que sume los números del 1 al 100. Crea dos hilos que sumen los números

del 1 al 50 y del 51 al 100, respectivamente. Al final, imprime la suma total de ambos hilos.

Solución :

class Suma implements Runnable { private int inicio; private int fin; private int resultado; public Suma(int inicio, int fin) { this .inicio = inicio; this .fin = fin; } public void run() { resultado = 0; for (int i = inicio; i <= fin; i++) { resultado += i; } } public int getResultado() { return resultado; } } public class EjemploSumaConcurrente { public static void main(String[] args) { Suma suma1 = new Suma(1, 50); Suma suma2 = new Suma(51, 100); Thread hilo1 = new Thread(suma1); Thread hilo2 = new Thread(suma2); hilo1.start(); hilo2.start(); try { hilo1.join(); hilo2.join(); } catch (InterruptedException e) { e.printStackTrace(); } int total = suma1.getResultado() + suma2.getResultado(); System.out.println("Suma total: " + total); }

Ejercicio 5: Productor y Consumidor

Enunciado : Implementa el patrón de productor-consumidor utilizando hilos. Crea una

clase Buffer que tenga un tamaño fijo y métodos para agregar y quitar elementos. Crea un

hilo productor que agregue elementos al buffer y un hilo consumidor que los quite.

Asegúrate de que el productor no agregue elementos si el buffer está lleno y que el

consumidor no intente quitar elementos si el buffer está vacío.

Solución :

import java.util.LinkedList ; import java.util.Queue ; class Buffer { private Queue cola = new LinkedList<>(); private int capacidad; public Buffer(int capacidad) { this .capacidad = capacidad; } public synchronized void agregar(int valor) throws InterruptedException { while (cola.size() == capacidad) { wait(); // Espera si el buffer está lleno } cola.add(valor); System.out.println("Producido: " + valor); notifyAll(); // Notifica a los hilos que están esperando } public synchronized int quitar() throws InterruptedException { while (cola.isEmpty()) { wait(); // Espera si el buffer está vacío } int valor = cola.poll(); System.out.println("Consumido: " + valor); notifyAll(); // Notifica a los hilos que están esperando return valor; } } class Productor implements Runnable { private Buffer buffer; public Productor(Buffer buffer) { this .buffer = buffer; } public void run() { for (int i = 0; i < 10; i++) { try { buffer.agregar(i); Thread.sleep(500); // Simula tiempo de producción } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumidor implements Runnable { private Buffer buffer; public Consumidor(Buffer buffer) { this .buffer = buffer; } public void run() {

Ejercicio 6: Hilos y Prioridades

Enunciado : Crea dos hilos que impriman números del 1 al 10. Uno de los hilos debe tener

una prioridad alta y el otro una prioridad baja. Observa cómo se comportan los hilos y si la

prioridad afecta el orden en que se imprimen los números. Imprime el nombre del hilo junto

con el número que está imprimiendo.

Solución :

class HiloPrioridad implements Runnable { private String nombre; public HiloPrioridad(String nombre) { this .nombre = nombre; } public void run() { for (int i = 1; i <= 10; i++) { System.out.println(nombre + ": " + i); try { Thread.sleep(100); // Pausa de 0.1 segundos } catch (InterruptedException e) { System.out.println(nombre + " interrumpido"); } } } } public class EjemploPrioridades { public static void main(String[] args) { Thread hiloAlta = new Thread( new HiloPrioridad("Hilo Alta Prioridad")); Thread hiloBaja = new Thread( new HiloPrioridad("Hilo Baja Prioridad")); hiloAlta.setPriority(Thread.MAX_PRIORITY); // Prioridad alta hiloBaja.setPriority(Thread.MIN_PRIORITY); // Prioridad baja hiloAlta.start(); hiloBaja.start(); }

Ejercicio 8: Hilos Interrumpidos

Enunciado : Crea un hilo que imprima números del 1 al 10 con un retraso de 1 segundo

entre cada número. En la clase principal, después de 5 segundos, interrumpe el hilo.

Asegúrate de manejar la excepción InterruptedException y de imprimir un mensaje que

indique que el hilo ha sido interrumpido.

Solución :

class HiloInterrumpido implements Runnable { public void run() { for (int i = 1; i <= 10; i++) { System.out.println(i); try { Thread.sleep(1000); // Pausa de 1 segundo } catch (InterruptedException e) { System.out.println("Hilo interrumpido"); return ; // Salir del método si se interrumpe } } } } public class EjemploInterrupcion { public static void main(String[] args) { Thread hilo = new Thread( new HiloInterrumpido()); hilo.start(); try { Thread.sleep(5000); // Espera 5 segundos hilo.interrupt(); // Interrumpe el hilo } catch (InterruptedException e) { e.printStackTrace(); } }

import java.awt.Dimension ; import java.awt.Image ; import java.awt.Toolkit ; import javax.swing.* ; public class MarcoCentrado extends JFrame{ public MarcoCentrado() { Toolkit miPantalla= Toolkit.getDefaultToolkit(); Dimension tamanoPantalla=miPantalla.getScreenSize(); int alturaPantalla=tamanoPantalla.height; //el alto de mi pantalla int anchoPantalla=tamanoPantalla.width; // el ancho de la pantalla this .setSize(anchoPantalla/2, alturaPantalla/2); this .setLocation(anchoPantalla/4, alturaPantalla/4); this .setTitle("MARCO CENTRADO"); // ICONO Image miIcono=miPantalla.getImage("rony.png"); setIconImage(miIcono); this .setVisible( true ); this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } import javax.swing.* ; public class MiMarco extends JFrame{ public MiMarco() { //definir el tamaño //this.setSize(300, 300); //para hacer visible el marco this .setVisible( true ); //para que se cierre el marco this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //titulo del marco this .setTitle("Hola Ronald"); // cambiar la unicaion //this.setLocation(500, 300); //tamaño y posision this .setBounds(400, 200, 550, 550); //para que no se redimencione// el botonn de maximizar se oculte //this.setResizable(false); //pantalla completa Frame.MAXIMIZED_BOTH == //this.setExtendedState(6); }