2016-03-23 17 views
0

sayıları yazdırmak için nasıl o röportaj var:Java Multithreading - doğal düzenin

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

Ben başarmak nasıl 1000 kadar doğal sırayla .... 0 1 2 3 4 yazdırmak istiyorum. Eğer konuları başlattığınızda, o zaman, = ThreadDemo2.aa

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

Başkalarının kodunuzu kopyalamasını, derlemesini ve çalıştırmasını beklemeyin. Bize ne olduğunu anlatırsan daha kolay olur. Ayrıca, söyleyebileceğim kadarıyla, kodunuz burada gerekli olan önemli şeyden yoksundur: iki parçacığı birbirine bağlamak zorundasınız, temel olarak numaraları doğru sırayla basmak için kilitlemede çalışması gerekir. Bu atama ** sert ** kısmı gibi. Yani, senin için ağır kaldırmamızı mı istiyorsun? – GhostCat

+0

@ Jägermeister, bu genellikle insanlara söylediğimiz şeyin tam tersidir. OP'nin “ne olduğunu size anlatmasını” istersiniz, ancak OP ne olduğunu anlamaz. Bu yüzden soruyor. Kodun gerçekte kodun kendisinden daha iyi bir açıklaması yoktur. Sadece "Dude! Bize kodunuzu göster!" OTOH, bazı zamanlarda çok fazla kod yazıyorlar ve bunu basitleştirmelerini istiyoruz: (bkz. Http://sscce.org/) –

+0

Lütfen başka bir şey için http://stackoverflow.com/a/36183057/437506 adresine bakın. –

cevap

0

Maalesef birçok kez bu uygulamayı çalıştırdığınızda

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) { 

    } 
} 

} 

, orada olduğunu göreceksiniz, 2 farklı iş parçacığı üzerinde çalışan çünkü JVM sonucunu bekleyemezsiniz, ama böyle bir şey yapabilirsiniz Bu, diğer% 100

+0

teşekkürler, çalışıyor, kodu anlayabiliyorum.Ama ben 1000 ile 10 arasında değiştirirsem çalışmıyorum. – Sun

+0

Size sonuç bekleyemeyeceğini söyledim, bu yüzden diğer% 100 gibi bir sonuç yok OS ya da JVM im emin değilim –

0

:

Bu şekilde çalıştı.

OddThread'daki for döngüsünü hiçbir zaman başlatmayın. Bu nedenle program ilerlemez. Bunun yerine

:

  • gelen döngüler için hem koşulunu && ThreadDemo2.aa == 0//or 1 kaldırın.
  • Zaman gecikmesini kaldırın.
  • Bu satırı ekleyin: while(ThreadDemo2.aa == 0){}// or 1 ilgili döngülere.

Bu hat döngü bekle yapacak değere kadar doğru ve daha sonra sadece döngü yönde hareket edecektir. Bu probleminizi çözmeli.

+0

Değişken aa da uçucu olmalı veya başka bir iş parçacığı yapılan değişiklikleri asla görememeli. –

+0

@Leto, Belki haklısınız, ancak bu değişikliklerle denedim ve “aa” uçucu olduğunu bildirmeden mükemmel bir şekilde çalıştı. – Hackerdarshi

0

gibi sonuç bulunamadı. Monitörleri kullanarak, doğru çıkışı sağlamak için ekstra döngüler eklemeniz gerekmeyecektir.

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

Muhtemelen egzersizinizin kapsamı, Thread kilitlerini kullanmaktı. Aşağıdaki örnekte iki Monitor Object kilit kullanılmıştır. İpliklerin her biri temel olarak, diğerinin ilerlemeden önce iterasyonunu tamamlamasını bekler.

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



    } 
}