2016-03-23 22 views
0

Ich habe es das Interview:Java Multithreading - Wie Zahlen zu drucken, in der natürlichen Ordnung

Thread-A Prints Even numbers from 0 
Thread-B prints Odd numbers from 1 

I 0 1 2 3 4 .... in natürlicher Reihenfolge bis 1000 drucken möchten Wie kann ich achive.

habe ich versucht, auf diese Weise:

public class ThreadDemo2 { 
    static int aa = 0; 

    public static void main(String[] args) { 
     boolean mytime = true; 
     EvenThread et = new EvenThread(mytime); 
     OddThread ot = new OddThread(mytime); 
     et.start(); 
     ot.start(); 

    } 

} 

class EvenThread extends Thread { 
    boolean mytime; 
    int i = 0; 

    public EvenThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 0) { 
      for (int i = 0; i < 1000 && ThreadDemo2.aa == 0; i += 2) { 
       System.out.println(i); 
       ThreadDemo2.aa = 1; 
       try { 
        sleep(500); 

       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     // } 

     }/* else 
      try { 
       this.wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
    } 

} 

class OddThread extends Thread { 
    boolean mytime; 
    int i = 1; 

    public OddThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 1) { 
      for (int i = 1; i < 1000 && ThreadDemo2.aa == 1; i += 2) { 
       System.out.println(i); 
       ThreadDemo2.aa = 0; 
       try { 
        sleep(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      //ThreadDemo2.aa = 0; 
     //} 
    } 

} 
+0

Erwarten Sie nicht, dass andere Ihren Code kopieren, kompilieren und ausführen. Es ist einfacher, wenn Sie uns sagen, was passiert. Außerdem fehlt Ihrem Code, soweit ich das sagen kann, das Wesentliche, das hier benötigt wird: Sie müssen die beiden Threads ineinandergreifen, im Grunde müssen sie im Lockstep laufen, um die Zahlen in der richtigen Reihenfolge auszudrucken. Das ist wie der ** harte ** Teil der Aufgabe. Also, wollen Sie, dass wir das schwere Heben für Sie erledigen? – GhostCat

+0

@ Jägermeister, das ist das Gegenteil von dem, was wir normalerweise Leuten sagen. Sie möchten, dass das OP "Ihnen sagt, was passiert", aber das OP versteht nicht, was passiert. Deshalb fragt er. Es gibt keine bessere Beschreibung dessen, was Code tatsächlich tut, als der Code selbst. Versuche einfach, die Kommentare zu SO zu zählen, die sagen: "Alter! Zeig uns deinen Code!" OTOH, manchmal posten sie zu viel Code und wir bitten sie, es zu vereinfachen: (siehe http://sscce.org/) –

+0

Weitere Informationen finden Sie unter http://stackoverflow.com/a/36183057/437506. –

Antwort

0

Leider kann man nicht erwarten, dass das Ergebnis wegen der JVM arbeitet an zwei verschiedenen Threads, aber man kann so etwas tun,

public class Test12 { 

public static void main(String[] args) { 
    Thread1 t1=new Thread1(); 
    Thread2 t2=new Thread2(); 


} 

} 

class Thread1 implements Runnable { 

public Thread1() { 
    Thread t = new Thread(); 
    t.start(); 
} 

@Override 
public void run() { 
    try { 
     for (int i = 0; i < 1000; i++) { 
      if (i % 2 == 0) { 
       System.out.println(i); 
      } 

     } 

    } catch (Exception e) { 

    } 
} 
} 

class Thread2 implements Runnable { 

public Thread2() { 
    Thread t = new Thread(this); 
    t.start(); 

} 

@Override 
public void run() { 
    try { 
     for (int i = 0; i < 1000; i++) { 
      if (i % 2 == 1) { 
       System.out.println(i); 
      } 

     } 

    } catch (Exception e) { 

    } 
} 

} 

, wenn Sie diese Anwendung ausführen zu oft, werden Sie feststellen, dass es kein Ergebnis wie andere 100%

+0

danke, es wird funktionieren, ich bin in der Lage, den Code zu verstehen.aber es funktioniert nicht, wenn ich 1000 zu 10 ändere. – Sun

+0

Ich sagte Ihnen, dass Sie das Ergebnis nicht erwarten können, so gibt es kein Ergebnis wie andere 100% hängt es von OS oder Ihrer JVM bin ich nicht sicher –

0

Wenn Sie die Threads beginnen, zu diesem Zeitpunkt, ThreadDemo2.aa = .

So startet die for Schleife in OddThread nie. Daher bewegt sich das Programm nicht vorwärts.

Statt:

  • entfernen, um den Zustand von sowohl der && ThreadDemo2.aa == 0//or 1 für Schleifen.
  • entfernen Sie die Zeitverzögerung.
  • fügen Sie diese Zeile: while(ThreadDemo2.aa == 0){}// or 1 in den jeweiligen Schleifen. korrekte und dann nur die Schleife bewegt sich vorwärts

Diese Linie wird die for-Schleife warten, bis zum Wert machen. Dies sollte dein Problem lösen.

+0

Variable aa muss auch als flüchtig deklariert werden oder ein anderer Thread könnte die vorgenommenen Änderungen nie sehen. –

+0

@Leto, Vielleicht hast du recht, aber ich habe es mit diesen Änderungen versucht, und es hat perfekt funktioniert, ohne 'aa' volatile zu deklarieren. – Hackerdarshi

0

Mit diesem Ansatz können Sie Ihre Aufgabe ausführen. Wenn Sie Monitore verwenden, müssen Sie keine zusätzlichen Schleifen hinzufügen, um die korrekte Ausgabe zu gewährleisten.

public class ThreadDemo2 { 
    static int aa = 0; 
    static Object lock = new Object(); 

    public static void toggleThread(int threadaa) throws Exception 
    { 
    synchronized(lock) 
    { 
     if(aa == threadaa) 
     { 
      aa = (threadaa - 1) * -1; 
      lock.notifyAll(); 
      lock.wait(); 
     } 
     else 
     { 
      lock.wait(); 
     } 
    } 
    } 

    public static void releaseThreads() 
    { 
    try 
    { 
      synchronized(lock) 
     { 
      lock.notifyAll(); 
     } 
    } 
    catch(Exception e) 
    { 
    } 
    } 

    public static void main(String[] args) { 
     boolean mytime = true; 
     EvenThread et = new EvenThread(mytime); 
     OddThread ot = new OddThread(mytime); 
     et.start(); 
     ot.start(); 

    } 

} 

class EvenThread extends Thread { 
    boolean mytime; 
    int i = 0; 

    public EvenThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 0) { 
      for (int i = 0; i < 10; i += 2) {  
       try { 
        ThreadDemo2.toggleThread(0); 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     System.out.println(i); 
     // } 

     }/* else 
      try { 
       this.wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
    ThreadDemo2.releaseThreads(); 
    } 

} 

class OddThread extends Thread { 
    boolean mytime; 
    int i = 1; 

    public OddThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 1) { 
      for (int i = 1; i < 10; i += 2) { 


       try { 
        ThreadDemo2.toggleThread(1); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     System.out.println(i); 
      } 
      //ThreadDemo2.aa = 0; 
     //} 
    ThreadDemo2.releaseThreads(); 
    } 

} 
0

Wahrscheinlich war der Bereich Ihrer Übung, Thread Locks zu verwenden. Im folgenden Beispiel werden zwei Monitor Object-Sperren verwendet. Jeder der Threads wartet im Grunde darauf, dass der andere seine Iteration beendet, bevor er weitergeht.

public class ThreadInterleave { 

    public static class Even implements Runnable{ 
     private Object even; 
     private Object odd; 
     private int count = 0; 

     public Even(Object even,Object odd){ 
      this.even = even; 
      this.odd = odd; 
     } 

     public void run(){ 
      while(count<1000) { 
        System.out.println(count); 
        count+=2; 
       synchronized (odd){ 
        odd.notify(); 
       } 

       synchronized (even){ 
        try { 
         even.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 



      } 
     } 
    } 

    public static class Odd implements Runnable{ 
     private Object even; 
     private Object odd; 
     private int count = 1; 

     public Odd(Object even,Object odd){ 
      this.even = even; 
      this.odd = odd; 
     } 

     public void run(){ 
      while(count<1000) { 
       System.out.println(count); 
       count+=2; 
       synchronized (even){ 
        even.notify(); 
       } 

       synchronized (odd){ 
        try { 
         odd.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 



      } 
     } 
    } 

public static void main(String[] args){ 
     final Object even = new Object(); 
     final Object odd = new Object(); 
     Thread tEven = new Thread(new Even(even,odd)); 
     Thread tOdd = new Thread(new Odd(even,odd)); 


     tEven.start(); 
     tOdd.start(); 



    } 
}