2016-03-27 2 views
0

これらのスレッドを1文字/秒の順序で印刷しようとしています。私が眠ったら、それは順番になります。どのように私はそれを順不同にし、毎秒1文字(任意)を印刷するのですか?Java Threads、1文字/秒の順番で印刷

public class Number1{  
    public static void main(String[] args){ 

     try{ 
     Thread a = new Thread(new thread1("A")); 
     Thread b = new Thread(new thread1("B")); 
     Thread c = new Thread(new thread1("C")); 
     a.start(); 
     b.start(); 
     c.start(); 
     a.join(1000); 
     b.join(1000); 
     c.join(1000); 
     } 
     catch(InterruptedException e) { 
       System.out.println("Error"); 
      } 


    } 
} 

class thread1 implements Runnable{ 

    String character; 


    public thread1(String a){ 
     this.character = a; 
    } 

    public void run(){ 
      for(int i = 1;i<21;i++) 
      {   
      System.out.println("No."+i+" Thread: "+character); 
      } 
    } 
} 

答えて

0

Thread.sleep()スレッドを1秒間スリープ状態にして続行する方法です。メソッドjoinを使用しています。だから私は、セマフォを使用することになり1000年

public class Number1{  
    public static void main(String[] args){ 

     try{ 
     Thread a = new Thread(new thread1("A")); 
     Thread b = new Thread(new thread1("B")); 
     Thread c = new Thread(new thread1("C")); 
     a.start(); 
     b.start(); 
     c.start(); 
     a.join(1000); 
     b.join(1000); 
     c.join(1000); 
     } 
     catch(InterruptedException e) { 
       System.out.println("Error"); 
      } 


    } 
} 

class thread1 implements Runnable{ 

    String character; 


    public thread1(String a){ 
     this.character = a; 
    } 

    public void run(){ 
      for(int i = 1;i<21;i++) 
      {   
       Thread.sleep(1000);// This will make the current thread sleep for 1 second 
      System.out.println("No."+i+" Thread: "+character); 
      } 
    } 
} 
+0

はい、それを行い、.join()を削除すると、1秒あたり3文字を出力します。ランダムな順序で1文字(スレッド)を1秒間に印刷したい。 –

+0

これが機能する場合。それから、ありがとうございました。 – Jois

0

あなたのコードでforループにスリープ状態を追加しましたが、動作しているようです。

No.1のスレッド:C
No.1のスレッド:B
No.1のスレッド:
その2スレッド:
その2スレッド:C
その2スレッド: B
3番スレッド:
3番スレッド:C
3番スレッド:B
4番スレッド:C
4番スレッド:B
4番スレッド:
5番スレッド: A
No.5 スレッド:B
No.5スレッド:C

文字A、B、Cはランダムな順序で表示されます。これはあなたが達成しようとしているものではありませんか?

+0

ただし、1秒あたり3文字を出力します。ランダムな順序で1文字(スレッド)を1秒間に印刷したい。しばらくしてから印刷することに気がついたら、もう一度同じ順序になります。 –

+0

これは、一度に3つのスレッドを開始するために起こります。他の2つのスレッドだけを削除してください。その後、一度に1文字しか印刷されません。 – Jois

0

(のThread.sleepするように変更。

私はゼロ許可証を持っているセマフォを初期化するだろう、と私は3つのカウントスレッドのそれぞれが1つを取る作ると思いますすべてのスレッドが終了するまで、セマフォーに1つの許可を追加します。

0

正しく理解すれば、競合状態:印刷される文字は、最初にそこに到達するスレッドによって異なります。これにより、3つの文字が印刷されるのが普通です一度に1つずつではなく同時に実行します。もしそうでなければ、その注文はもはやランダムではないでしょう。最も効果的なのは、3つのスレッドがそれぞれの文字を印刷したい順番を覚えてから、まずスレッドをシャッフルしてから、再びスレッドに参加してからスレッドの3つの文字をプリントアウトすることです。私は決してこれに関する専門家ではありませんが、文字を同期ブロックの文字列に追加するコードを配置する必要があると思います。このようなビット:

public class Number1 
{ 
    public static void main(String[] args) 
    { 
     Printer printer=new Printer(); 
     try 
     { 
      Thread a = new Thread(new thread1("A", printer)); 
      Thread b = new Thread(new thread1("B", printer)); 
      Thread c = new Thread(new thread1("C", printer)); 
      a.start(); 
      b.start(); 
      c.start(); 
      a.join(1000); 
      b.join(1000); 
      c.join(1000); 
     } 
     catch(InterruptedException e) 
     { 
       System.out.println("Error"); 
     } 
    } 
} 

class Printer 
{ 
    int i=0; 
    String[] strings=new String[3]; 
    //this method only prints and waits if it is called by the last of the three threads, to print all three 
    //characters. So it returns true if the thread itself needs to wait three seconds. All three 
    //threads must try to call it simultaneously so the order is random; to prevent errors though the method is synchronised. 
    public synchronized boolean print(String s) 
    { 
     strings[i++]=s; 
     if(i==3) 
     { 
      for(i=0; i<3; i++) 
      { 
       System.out.println(strings[i]); 
       try 
       { 
        Thread.sleep(1000); 
       } 
       catch(Exception e) 
       { 
       } 
      } 
      i=0; 
      return false; 
     } 
     return true; 
    } 
} 

class thread1 implements Runnable 
{ 
    String character; 
    Printer printer; 
    public thread1(String a, Printer printer) 
    { 
     this.character = a; 
     this.printer=printer; 
    } 

    public void run() 
    { 
     for(int i = 1;i<21;i++) 
     {  
      if(printer.print("No."+i+" Thread: "+character)) 
      { 
       try 
       { 
        Thread.sleep(3000); 
       } 
       catch(Exception e) 
       { 
       } 
      } 
     } 
    } 
}