2009-12-15 8 views
17

Je suis nouveau sur les threads. Comment puis-je obtenir t.join pour que le thread qui l'appelle attende l'exécution de t?Java: comment utiliser Thread.join

Ce code ne ferait que geler le programme, car le thread attend lui-même de mourir, non?

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); 
    } 
} 

Que ferais-je si je voulais avoir deux fils, l'un qui imprime la moitié du tableau info, puis attend l'autre pour terminer avant de faire le reste?

Répondre

18

Utilisez quelque chose comme ceci:

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

Vous devez appeler la méthode join sur l'autre thread.
Quelque chose comme:

@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

Avec otherThread étant l'autre thread, vous pouvez faire quelque chose comme ceci:

@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 
    }  
} 

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

Questions connexes