1. 程式人生 > >多執行緒程式設計(二)——面試題,每個執行緒只打印一種字元,多個執行緒協同順序列印n次字串(求大神的其他實現方案)

多執行緒程式設計(二)——面試題,每個執行緒只打印一種字元,多個執行緒協同順序列印n次字串(求大神的其他實現方案)

(這個是歡聚時刻(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