多執行緒程式設計(二)——面試題,每個執行緒只打印一種字元,多個執行緒協同順序列印n次字串(求大神的其他實現方案)
阿新 • • 發佈:2018-12-24
(這個是歡聚時刻(YY)的筆試題,在筆試的時候沒有寫出來,後來自己寫了出來,希望大神能給出更優秀的解決方案……ps:現在面試官總有面試時問筆試程式設計題思路的習慣,呵呵)
題目簡述:
輸入一個字串以及列印次數,為每一個字元建立一個執行緒,這個執行緒只負責列印一種字元,多執行緒迴圈列印字串。效果如下:
廢話不多說直接上程式碼:
效果圖:public class 筆試題 { //標識當前該輸出的字元,用volatile關鍵字保證可見性 public static volatile char now; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請輸入要迴圈列印的字串:"); String str = scanner.nextLine(); while (str.length() < 1){ System.out.println("輸入有誤,請重新輸入:"); str = scanner.nextLine(); } char[] chars = str.toCharArray(); System.out.println("請輸入迴圈列印的次數:"); int temp = scanner.nextInt(); while (temp < 1){ System.out.println("輸入有誤,請重新輸入:"); temp = scanner.nextInt(); } final int n = temp; //匿名內部類中只能訪問方法中的常量 for (int j = 0; j < chars.length; j++) { final int t = j;//匿名內部類中只能訪問方法中的常量 Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < n; i++) {//用於控制輸出的次數 while (now != chars[t]) {//迴圈等待now指向該執行緒該輸出的字元 } System.out.print(chars[t]);//輸出字元 if (t + 1 < chars.length)//修改now值,指向下一個該輸出的字元 now = chars[t + 1]; else now = chars[0]; } } }); thread.start(); } now = chars[0]; } }
至於為什麼方法中的匿名內部類只能訪問常量呢?參看一篇部落格:http://feiyeguohai.iteye.com/blog/1500108