[Java] Ayuda ejercicio multihilos (ThreadPoolExecutor)

B

Holi, estoy en el 2do año de mi FP y soy un futuro mono que precisa explicación / ayuda.

Tengo un problema con un ejercicio de multihilo en Java (bueno la clase entera esta más o menos igual que yo), donde nos han explicado la teoría resumida, por encima y además nos han enseñado dos ejercicios hechos y explicados también por encima trabajando con ThreadPoolExecutor newFixedThreadPool y newScheduledThreadPool.

NO estoy pidiendo que me hagáis el ejercicio, vengo a consultar y resolver dudas, entender como implementar lo que tengo que hacer ya que voy perdido.

El ejercicio es el siguiente:

• Crear un cliente cada 3 segundos. En total habrá 50 clientes.
• Cada cliente lleva un número aleatorio (de entre 1 y 30) artículos y cada artículo en cuestión tarda un tiempo en pasar por caja (de entre 2 y 8 segundos) ya que hay ya objetos que pesan poco y otros que pesan mucho. Puedes utilizar un vector, una lista o un array para representar estos datos (hazlo sencillo, dedica tiempo para ver qué estructura es más sencilla!).
• Probar diferentes número de hilos (1, 2, 5 y 10) para pasar los artículos por caja.
• Probar con 10 cajas, y diferente número de clientes (100 y 500)

• Crear un cliente cada 3 segundos. En total habrá 50 clientes.
Entiendo que tengo que crear una clase cliente verdad? que implemente "Callable" aquí viene mi primera cuestión -> le paso algo? En el ejercicio de ejemplo implementa un Callable<Integer>. Mi lógica de mono me dice que tengo que hacer un Callable de tipo Cliente en plan Callable<Cliente>
Y en el método call() retornar un objeto Cliente es decir new Cliente() ?
Además se que tengo que hacer un Thread.sleep(3000) de 3 segs.

Aquí viene el gran dilema que tengo -> donde tengo que implementar todo lo siguiente?
• Cada cliente lleva un número aleatorio (de entre 1 y 30) artículos y cada artículo en cuestión tarda un tiempo en pasar por caja (de entre 2 y 8 segundos)

Dónde cojones lo implemento? Creo un atributo en la clase de Cliente y en el constructor le paso parámetro? no, verdad? por que sino a la hora de retornar en el método call() tengo que pasarle un parámetro. O directamente inicio dicho artículo?

Hago bucle y un array por ejemplo de número de artículos y le almaceno en cada artículo un número de segundo y luego hago un Thread.sleep() del valor que tenga dicho recorrido de array?

EDIT: Se me olvidaba el resultado tiene que ser este:

Creado el cliente 1 con 5 artículos (2, 8, 5, 3, 4)
Cliente 1 pasa por caja...
Cliente 1 artículo 1/5 (2 segundos)...
Creado el cliente 2 con 3 artículos (5, 7)
Cliente 2 pasa por caja...
Cliente 2 artículo 1/2 (5 segundos)...
Cliente 1 artículo 2/5 (8 segundos)...
Cliente 1 artículo 3/5 (5 segundos)...
Cliente 2 artículo 2/2 (7 segundos)...FINALIZADO
Cliente 1 artículo 4/ (3 segundos)...
Cliente 1 artículo 5/5 (7 segundos)...FINALIZADO

privet

Pon el código que hayas hecho

1 respuesta
B

#2

He borrado todo lo que he hecho, ya que todo estaba mal implementado, ergo no iba nada xD. Mañana empiezo de 0 y posteo.

KarlosWins

.

Grise

Entiendo que en el ejercicio lo que se pide es paralelizar el paso por caja.

Haría clases main, Cliente y Caja (Runnable, porque no te hace falta un resultado creo).

En el hilo principal crearía a los clientes, creando el carrito con artículos random en su constructor, y luego los pasaría por las cajas (los hilos) y en el run de Caja (el hilo) es donde metería la espera random entre artículo y artículo.

En cuanto al resultado es imposible que sea ese exactamente porque cuando paralelizas las cosas se ejecutan en el orden que le sale del pito al procesador (además que los datos son random), lo que quiere decir con ese resultado es que tienes que ver como se van mezclando los clientes y sus artículos.

No se me ocurre como ayudarte mejor sin hacerlo directamente.

1 1 respuesta
B

#5

Grandísima respuesta, gracias. El resultado no tiene que ser exactamente ese, pero si similar (la estructura) ya que como has dicho los hilos se ejecutan como quieren.

Lo que según mi lógica no hace falta una clase de caja como me dices, no?

Sigo teniendo dudas igualmente por que estoy muy espeso ahora mismo sin estar tocando ningún código ni nada... el tema de los artículos, pide que por ejemplo cada cliente tenga un número aleatorio de artículo y dicho artículo tenga X núm random que es los segundos que se tiene que ejecutar dicho artículo, es decir,

Cliente 1 artículos 4 y cada artículo se ejecutará en X segs que estos X segs hay que generarlos randoms y hacer otro Thread.sleep con el segundo del artículo en el que estamos.

De esta manera, yo entiendo que tengo que hacer un vector de X tamaño de artículos, generar un núm random de 2 a 8 y almacenarlo en cada posición del artículo? O me estoy liando la picha yo solo?

Edit: Te he releído y entiendo mucho mejor lo que has dicho, gracias otra vez.

Usuarios habituales