2016-03-08 49 views
0

程序的目標是將三個字符串發送到三個單獨的線程,並讓它們逐個字符地打印每個字符串。我想要在每個輸入字符串之間留出一個空白行,但我不確定將每個線程置於等待狀態的位置,還是停止輸出,以使輸出發生變化。大多數情況下,這是一串串混音,有時一個分開,整齊地出來。Java線程調度分離

import java.util.Scanner; 

public class Threader { 
    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Hello"); 
     String str = scan.nextLine(); 
     String str2 = scan.nextLine(); 
     String str3 = scan.nextLine(); 

     Thread A = new Thread(new MyRunnable(str)); 
     A.start(); 

     Thread B = new Thread(new MyRunnable(str2)); 
     B.start(); 

     Thread C = new Thread(new MyRunnable(str3)); 
     C.start(); 
    } 
} 

public class MyRunnable implements Runnable { 
    String str, str2, str3; 
    public MyRunnable(String str){ 
     this.str = str; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < str.length(); i++){ 
      System.out.println(str.charAt(i)); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }   
     } 
    } 
} 
+0

如果你想實現一個特定的分離,你一定要使用wait/notify或某種信號量。 – EJP

+1

我不明白,你想要每個線程打印字符串,每行一個字符,但你不想要另一個線程打印將有一個這樣做? – Asoub

回答

-1

這個怎麼樣?

import java.util.Scanner; 

public class Threader { 
    public Threader(String str, String str2, String str3) { 
     Thread A = new Thread(new MyRunnable(str)); 
     Thread B = new Thread(new MyRunnable(str2)); 
     Thread C = new Thread(new MyRunnable(str3)); 

     A.start(); 
     B.start(); 
     C.start(); 
    } 

    public synchronized void printString(String str) { 
     for (Character c : str.toCharArray()) { 
      System.out.println(c); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     System.out.println(); 
    } 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Hello"); 
     String str = scan.nextLine(); 
     String str2 = scan.nextLine(); 
     String str3 = scan.nextLine(); 

     new Threader(str, str2, str3); 
    } 

    class MyRunnable implements Runnable { 
     private String str; 

     public MyRunnable(String str) { 
      this.str = str; 
     } 

     @Override 
     public void run() { 
      printString(str); 
     } 
    } 
} 
+0

爲什麼選擇倒票?這個代碼不是做OP的要求嗎? –

0

這是一個答案,拼寫出來並將每個字符串與它們之間的空格分開。有趣的是,我的老師只是想讓他們在同一時間開始,並輸出所有混亂,只是爲了展示競賽狀態。 :p但在這裏,一對夫婦同時睡覺的循環。醜,但它的作品

import java.util.Scanner; 

public class Threader { 

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter 3 lines...Suuuuh dude"); 

    /* 
    * Strangs 
    */ 
    String str = scan.nextLine(); 
    String str2 = scan.nextLine(); 
    String str3 = scan.nextLine(); 

    /* 
    * Intantiate threads holding runnable objects 
    */ 
    Thread A = new Thread(new MyRunnable(str)); 
    Thread B = new Thread(new MyRunnable(str2)); 
    Thread C = new Thread(new MyRunnable(str3)); 

    A.start(); 
    // B.start(); 
    // C.start(); 

    /* 
    * try { A.join(); B.join(); C.join(); 
    * 
    * } catch (InterruptedException e) { // TODO Auto-generated catch block 
    * e.printStackTrace(); } 
    */ 

    /* 
    * Uncomment While() Loops To Eliminate race conditions (Threads will 
    * sleep if previous one is Alive(Won't fight for cpu)) 
    */ 

    while (A.isAlive()) { 
     try { 

      B.sleep(1000); 
      System.out.println("\n"); 
     } // end try 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } // end catch 
    } // end while 

    B.start(); 
    while (B.isAlive()) { 
     try { 
      C.sleep(1000); 
      System.out.println("\n"); 
     } // end try 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } // end catch 
    } // end while 
    C.start(); 
}// main METHOD 

}// Threader CLASS 

// Class w/Runnable Int。

public class MyRunnable implements Runnable { 

String str, str2, str3; 

public MyRunnable(String str) { 
    this.str = str; 
    this.str2 = str2; 
    this.str3 = str3; 

} 

@Override 
public void run() { 

    for (int i = 0; i < str.length(); i++) { 
     System.out.println(str.charAt(i)); 
     try { 
      // sleep 1 ms before printing next char 
      Thread.sleep(1); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } // for 
    System.out.println("end" + str); 
}// run 

}