2016-03-08 93 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 

}