Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/04/2014, 07:07
Avatar de nup_
nup_
 
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años
Puntos: 32
Respuesta: Duda Ejecución Hilos

Hola:
El problema con el primer código está en que dentro del run() de Reader
Código Java:
Ver original
  1. c.wait();
asume q el thread de Calculator no ha terminado. Lo cual, como bien dices, es un error. Si el thread de Calculator ya terminó el wait va a esperar eternamente.

El resultado q quieres obtener lo puedes hacer usando Futures, Callables y Executors.
Si te interesan los temas de concurrencia en java debes estudiar acerca del API de concurrencia "java.util.concurrent" (docs). Muchos de los problemas de concurrencia q te vas a encontrar ya tienen soluciones (e incluso patrones) implementadas.

Aquí te dejo un pequeño tutorial:
http://www.vogella.com/tutorials/Jav...y/article.html
en el cap 8 resuelven un problema muy parecido al tuyo, basándose en ese código podemos llegar a este:
Código Java:
Ver original
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.Future;
  8.  
  9. public class CallableFutures {
  10.     // Cantidad de hilos
  11.     private static final int NTHREDS = 3;
  12.  
  13.     public static void main(String[] args) {
  14.  
  15.         ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
  16.         List<Future<Long>> list = new ArrayList<Future<Long>>();
  17.        
  18.         Callable<Long> worker = new MyCallable();
  19.  
  20.         for (int i = 0; i < NTHREDS; i++) {
  21.             Future<Long> submit = executor.submit(worker);
  22.             list.add(submit);
  23.         }
  24.  
  25.         for (Future<Long> future : list) {
  26.             try {
  27.                 System.out.println("Total is: " + future.get());
  28.             } catch (InterruptedException e) {
  29.                 e.printStackTrace();
  30.             } catch (ExecutionException e) {
  31.                 e.printStackTrace();
  32.             }
  33.         }
  34.         executor.shutdown();
  35.     }
  36. }
  37.  
  38. class MyCallable implements Callable<Long> {
  39.     @Override
  40.     public Long call() throws Exception {
  41.         long sum = 0;
  42.         for (long i = 0; i < 100; i++) {
  43.             sum += i;
  44.         }
  45.         return sum;
  46.     }
  47.  
  48. }

slds;

nup_