Java 多线程 不使用锁机制 实现交替打印数字和字母
这是一道经典的面试题,使用两个线程去交替打印数字和字母,输出1A2B3C4D5E6F7G…这样的效果,看了网上很多的文章,基本都是使用Condition、阻塞队列、多线程的锁机制之类的方法去实现,那么像我这样刚接触多线程的萌新,在对大佬们?说的这些东西还不是很了解的情况下,不使用多线程的锁机制,如何去解决这个问题呢?这里主要用到了while的死循环来代替wait()和notify()的效果。
简单说一下我这里的思路:
- 多个线程间共享的数据称为临界资源,这里我们使用一个布尔类型的静态成员变量flag,通过其状态控制两个线程的输出;
- 两个子线程,一个打印数字,一个打印字母;
- 若当flag为true时打印数字,flag为false时打印字母,因为两个线程是同时进行的,则当flag为true时,我们要让打印字母的线程进入等待状态,这里我们让其进入死循环状态,打印数字的线程开始打印数字,并改变flag的状态。与此相同,当flag为false时,打印字母的线程开始工作,打印数字的线程进入“等待”状态。
- 每打印一次就改变一次flag的状态值,这样便实现了交替打印的效果。
下面是代码以及输出结果:
public class Test2 {
//临界资源
private static boolean flag = true;
public static void main(String[] args) {
Thread thread = new Thread(new PrintNum());
//启动线程
thread.start();
//打印字母的线程
for (char ch = 'A'; ch <= 'Z'; ch++) {
//flag为true时进入死循环
while (flag) {
}
//flag为false时打印字母
System.out.print(ch);
//每打印一次,改变一次状态值
flag = !flag;
}
}
/**
* 打印数字的线程
*/
static class PrintNum implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 26; i++) {
//flag为false时进入死循环
while (!flag) {
}
//flag为true时打印数字
System.out.print(i);
flag = !flag;
}
}
}
}
输出结果: