Java|多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)

(这个是欢聚时刻(YY)的笔试题,在笔试的时候没有写出来,后来自己写了出来,希望大神能给出更优秀的解决方案……ps:现在面试官总有面试时问笔试编程题思路的习惯,呵呵)
【Java|多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)】

题目简述:
输入一个字符串以及打印次数,为每一个字符创建一个线程,这个线程只负责打印一种字符,多线程循环打印字符串。效果如下:
Java|多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)
文章图片




废话不多说直接上代码:

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]; } }

效果图: Java|多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)
文章图片



至于为什么方法中的匿名内部类只能访问常量呢?参看一篇博客:http://feiyeguohai.iteye.com/blog/1500108


    推荐阅读