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