2016-11-18 4 views
0

Problem - Erstellen Sie N-Threads (zB 3, Namen können Thread-1, Thread-2, Thread-3 sein), die HelloWorld in umgekehrter Reihenfolge sagen wird, dh erster Thread -3 wird HelloWorld, dann Thread-2 und dann Thread-1 sagen. Das obige Problem kann auf verschiedene Arten gelöst werden, wie die Verwendung eines flüchtigen Flags, um anzuzeigen, welcher Thread ausgeführt werden muss, oder die Verwendung der Join-Methode (so dass die Thread-1-Vervollständigung von Thread-2 und Thread-2 auf Thread-3 abhängt)). Ich versuche, dies durch Join-Methode zu lösen. Aber es gibt mir kein richtiges Ergebnis. Bitte hilf mir. Unten ist mein Programm -join() -Methode funktioniert nicht richtig in meinem implementierten Code

Thread [] previosThread = {null}; 
    int[] previousIndex = {0}; 
    for (int i=3; i>=1; i--) { 
     int currentIndex = i; 
     System.out.print("PreviousIndex--"+previousIndex[0]+" ; "); 
     System.out.println("CurrentIndex--"+currentIndex); 
     Thread newThread = new Thread("Thread-"+i) { 
      public void run() { 
       if(previousIndex[0]!=0 && previousIndex[0]==currentIndex+1) { 
        try { 
         previosThread[0].join(); 
        } catch (InterruptedException e) { 
         Thread.currentThread().interrupt(); 
        } 
       } 
       System.out.println(this.getName()+" is saying HelloWorld!!"); 
      } 
     }; 
     previosThread[0] = newThread; 
     previousIndex[0] = currentIndex; 
     newThread.start(); 
    } 

Above Programm wie unter unsicheren Ausgang geben -

PreviousIndex - 0; CurrentIndex - 3 PreviousIndex - 3; CurrentIndex - 2 ZurückIndex - 2; CurrentIndex - 1 Thread-2 sagt HelloWorld !! Thread-1 sagt HelloWorld !! Thread-3 sagt HelloWorld !!

+3

Das Starten eines Threads dauert eine kurze Zeit. Ihre Schleife wird sehr wahrscheinlich abgeschlossen sein, bevor * irgendein * Thread tatsächlich in die 'run()' Methode eintritt, also verweist 'previosThread [0]' auf den * letzten * Thread. Alle 3 Threads werden diesen letzten Wert sehen. – Andreas

+0

@Andreas: Vielen Dank. Du hast mein Problem gelöst. :) – malviyarahuljayendra

Antwort

0

Laut Andreas 'Kommentar verwendete ich previosThread [0] falsch. Anstatt previosThread [0] zu verwenden, habe ich ein separates Array von erstellten Threads verwaltet, so dass ich die Join-Methode für den neuen Thread korrekt aufrufen und dann alle Threads dieses Arrays in umgekehrter Reihenfolge starten kann, um die Join-Methode ordnungsgemäß zu verwenden und abhängigen Thread sollte ausgeführt werden. Unten ist mein Code ---

public class AntThread extends Thread { 

private Thread dependentThread; 
private String threadName; 
private int index; 
public AntThread(Thread dependentThread, String threadName, int index) { 
    super(threadName); 
    this.dependentThread = dependentThread; 
    this.threadName = threadName; 
    this.index = index; 
} 

public void run() { 
    if(dependentThread!=null) { 
     try { 
      dependentThread.join(); 
     } catch (InterruptedException e) { 
      this.interrupt(); 
     } 
    } 
    System.out.println(Thread.currentThread().getName()+" is saying - HelloWorld"); 
} 

}

und die Hauptklasse -

public class MultipleThreadsGreetingInReverseOrderTest {

public static void main(String[] args) throws InterruptedException { 

    int size = 10; 
    Thread [] createdThreads = new Thread[size]; 
    for(int i=size; i>0; i--) { 
     Thread dependentThread = null; 
     if(i!=size) 
      dependentThread = createdThreads[i]; 
     Thread antThread = new AntThread(dependentThread, "Thread-"+i, i); 
     createdThreads[i-1] = antThread; 
    } 

    //Starting the last thread first, as the join condition will work only when dependent thread is runnning 
    for(int j=createdThreads.length-1; j>=0; j--) { 
     createdThreads[j].start(); 
    } 

} 

}

Vielen Dank Andreas !! für die schnelle Antwort.

Verwandte Themen