2009-12-15 19 views
17

Soy nuevo en los hilos. ¿Cómo puedo hacer que t.join funcione, por lo que el hilo que lo llama espera hasta que termine de ejecutarse?Java: Cómo usar Thread.join

Este código simplemente congelaría el programa, porque el hilo está esperando a que muera, ¿no?

public static void main(String[] args) throws InterruptedException { 
    Thread t0 = new Thready(); 
    t0.start(); 

} 

@Override 
public void run() { 
    for (String s : info) { 
     try { 
      join(); 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.printf("%s %s%n", getName(), s); 
    } 
} 

¿Qué haría yo si quería tener dos hilos, uno de los cuales imprime la mitad de la matriz info, espera a que el otro para terminar antes de hacer el resto?

Respuesta

18

usar algo como esto:

public void executeMultiThread(int numThreads) 
    throws Exception 
{ 
    List threads = new ArrayList(); 

    for (int i = 0; i < numThreads; i++) 
    { 
     Thread t = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       // do your work 
      } 
     }); 

     // System.out.println("STARTING: " + t); 
     t.start(); 
     threads.add(t); 
    } 

    for (int i = 0; i < threads.size(); i++) 
    { 
     // Big number to wait so this can be debugged 
     // System.out.println("JOINING: " + threads.get(i)); 
     ((Thread)threads.get(i)).join(1000000); 
    } 
0

Usted tiene que llamar al método join en el otro hilo.
Algo así como:

@Override 
public void run() { 
    String[] info = new String[] {"abc", "def", "ghi", "jkl"}; 

    Thread other = new OtherThread(); 
    other.start(); 

    for (int i = 0; i < info.length; i++) { 
     try { 
      if (i == info.length/2) { 
       other.join(); // wait for other to terminate 
      } 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.printf("%s %s%n", getName(), info[i]); 
    }  
} 
4

Con otherThread siendo el otro hilo, se puede hacer algo como esto:

@Override 
public void run() { 
    int i = 0; 
    int half = (info.size()/2); 

    for (String s : info) { 
     i++; 
     if (i == half) { 
     try { 
      otherThread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.printf("%s %s%n", getName(), s); 
     Thread.yield(); //Give other threads a chance to do their work 
    }  
} 

El Java-tutorial de Sun: http://java.sun.com/docs/books/tutorial/essential/concurrency/join.html

Cuestiones relacionadas