1.0 synchronized
package com.example.demo.study.questions;
/**
* @ClassName Question13
* @Description: 经典多线程问题-轮流打印字母和数字
* @Author xtanb
* @Date 2019/10/22
* @Version V1.0
**/
public class Question13 {
private volatile boolean flag = true;
private int count = 1;
public synchronized void printNum(){
while (!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(2*count-1);
System.out.print(2*count);
flag = false;
this.notify();
}
public synchronized void printABC(){
while (flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print((char)('A'+count-1));
count++;
flag = true;
this.notify();
}
public static void main(String[] args) {
Question13 question13 = new Question13();
new Thread(()->{
for(int i=0;i<26;i++){
question13.printNum();
}
}).start();
new Thread(()->{
for(int i=0;i<26;i++){
question13.printABC();
}
}).start();
}
}
知识兔2.0 ReentranLock
package com.example.demo.study.questions;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @ClassName Question14
* @Description: 经典多线程问题-轮流打印字母和数字
* @Author xtanb
* @Date 2019/10/22
* @Version V1.0
**/
public class Question14 {
private volatile boolean flag = true;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private int num = 1;
public void printNum(){
try {
lock.lock();
while (!flag){
try{
condition.await();
}catch (Exception e) {
e.printStackTrace();
}
}
System.out.print(num*2-1);
System.out.print(num*2);
flag = false;
condition.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printABC(){
try {
lock.lock();
while (flag){
try{
condition.await();
}catch (Exception e) {
e.printStackTrace();
}
}
System.out.print((char)('A'+num-1));
num++;
flag = true;
condition.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) {
Question14 question14 = new Question14();
new Thread(()->{
for(int i=0;i<26;i++){
question14.printNum();
}
}).start();
new Thread(()->{
for(int i=0;i<26;i++){
question14.printABC();
}
}).start();
}
}
知识兔