今天看到一道面试题,要求实现两个线程交替打印A、B,作为练习,总结一下 代码
public class Info {
String msg = "A";
boolean flag = false;//交替执行标志
}
线程A
**
* 线程A,负责打印A
* Created by DONGSHILEI on 2017/10/17
*/
public class ThreadA implements Runnable{
private Info info;
public ThreadA(Info info) {
this.info = info;
}
@Override
public void run() {
while (true){
synchronized (info){
if (!info.flag){
try {
//线程等待
info.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName()+"--"+info.msg);
info.flag = false;
info.msg = "B";
//唤醒等待info的线程,选择一个
info.notify();
}
}
}
}
}
线程B
**
* 线程B 负责打印B
* Created by DONGSHILEI on 2017/10/17
*/
public class ThreadB implements Runnable{
private Info info;
public ThreadB(Info info) {
this.info = info;
}
@Override
public void run() {
while (true){
synchronized (info){
if (info.flag){
try {
info.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName()+"--"+info.msg);
info.msg = "A";
info.flag = true;
info.notify();
}
}
}
}
}
测试程序
**
* 两个线程,交替打印A、B
* Created by DONGSHILEI on 2017/10/17
*/
public class LockTest {
public static void main(String[] args) {
//公共对象,在线程获得该对象时加锁
Info info = new Info();
ThreadA a = new ThreadA(info);
ThreadB b = new ThreadB(info);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
执行结果
结果
-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
Thread-1--B
Thread-0--A
网友评论