@Yano
2017-07-31T12:54:32.000000Z
字数 1769
阅读 3760
面试题
3个线程A,B,C分别打印三个字母,每个线程循环10次,首先同步,如果不满足打印条件,则调用wait()函数一直等待;之后打印字母,更新state,调用notifyAll(),进入下一次循环。
public class printABC {private static int state = 0;public static void main(String[] args) {final printABC t = new printABC();Thread A = new Thread(new Runnable() {public void run() {// 设定打印10次for (int i = 0; i < 10; i++) {synchronized (t) {// 如果不满足A的打印条件,则调用wait,一直阻塞while (state % 3 != 0) {try {t.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 执行到这里,表明满足条件,打印A,设置state// 调用notifyAll方法System.out.print("A");state++;t.notifyAll();}}}});Thread B = new Thread(new Runnable() {public void run() {for (int i = 0; i < 10; i++) {synchronized (t) {while (state % 3 != 1) {try {t.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print("B");state++;t.notifyAll();}}}});Thread C = new Thread(new Runnable() {public void run() {for (int i = 0; i < 10; i++) {synchronized (t) {while (state % 3 != 2) {try {t.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("C");state++;t.notifyAll();}}}});A.start();B.start();C.start();}}
最近看到了原来写的博客,觉得当时写得并不是很好,重新写了一下,记录之。
package test;public class PrintABC {private static final int PRINT_A = 0;private static final int PRINT_B = 1;private static final int PRINT_C = 2;private static class MyThread extends Thread {int which; // 0:打印A;1:打印B;2:打印Cstatic volatile int state; // 线程共有,判断所有的打印状态static final Object t = new Object();public MyThread(int which) {this.which = which;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (t) {while (state % 3 != which) {try {t.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(toABC(which)); // 执行到这里,表明满足条件,打印state++;t.notifyAll(); // 调用notifyAll方法}}}}public static void main(String[] args) {new MyThread(PRINT_A).start();new MyThread(PRINT_B).start();new MyThread(PRINT_C).start();}private static char toABC(int which) {return (char) ('A' + which);}}