多线程打印问题

多线程打印问题

题目

最近面试遇到一个多线程的题目,对方要求用多个线程打印ABCABC…,每个线程负责打印其中一个字母。循环10次吧!

题解

public class Test {
	public static void main(String[] args) {
		String[] names = new String[]{"A", "B", "C"};
		Thread[] threads = new Thread[3];
		for (int i = 0; i < threads.length; i++) {
			threads[i] = new Thread(new PrintThread(i, names[i]));
			threads[i].start();
		}
	}
}

/**
 * 打印线程
 */
class PrintThread implements Runnable {
	/** 全局变量,存储打印的总次数 */
	private static int n;
	/** 当前线程的顺序号,各线程按顺序打印 */
	private int index;
	/** 当前线程要打印的信息 */
	private String msg;

	public PrintThread(int index, String msg) {
		this.index = index;
		this.msg = msg;
	}

	@Override
	public void run() {
		//只需要打印10*3=30次,也可以将条件换为true一直打印
		while (n < 30) {
			if (n % 3 == index) {
				System.out.print(msg);
				n++;
			} else {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

反馈

代码写完后,我立即拿给面试官,顺便对照代码给他讲了一个我的解题思路,结果讲完以后他说我这个不对,打出来不是ABCABC这样循环的。这个题需要用到线程间通信。我知道他的解题思路,下面附上线程通信方式的代码。但在这之前,我想说的是这个题目的解决方法有多种,只要能够符合题目要求的代码应该都是合格的。
不过,我之前好像也看到这上述多线程代码存在一些风险,但一时又想不起来了。如果有哪位朋友对此有更深的见解,欢迎留言指导。

线程间通信

/**
 * 打印线程
 */
class PrintThread implements Runnable {
	/** 全局变量,存储打印的总次数 */
	private static int n;
	private static Object obj = new Object();
	/** 当前线程的顺序号,各线程按顺序打印 */
	private int index;
	/** 当前线程要打印的信息 */
	private String msg;

	public PrintThread(int index, String msg) {
		this.index = index;
		this.msg = msg;
	}

	@Override
	public void run() {
		synchronized (obj) {
			while (n < 30) {
				if (n % 3 == index) {
					System.out.print(msg);
					n++;
					obj.notifyAll();
				} else {
					try {
						obj.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}

测试代码跟上述基本一样,这里就不再重复啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值