题目:两个线程交替顺序打印,一个输出正整数1到52,一个输出a-zA-Z,
例如 - 1a2b3c4d5e6f7g8h9i10j11k12l13m14n15o16p17q18r19s20t21u22v23w24x25y26z
27A28B29C30D31E32F33G34H35I36J37K38L39M40N41O42P43Q44R45S46T47U48V49W50X51Y52Z
一、使用volatile
二、使用Semaphore
三、思路: 一个线程等待,一个线程唤醒,始终只有一个线程执行
a. volatile
public class NumberDemo {
static class Inner {
private volatile boolean flag = true;
private int count = 1;
private int index = 1;
public synchronized void printNum() {
try {
while (!flag) {
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(count++);
flag = false;
this.notify();
}
public synchronized void printChar() {
try {
while (flag) {
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (index < 27) {
System.out.print((char) (index + 'a' - 1));
} else {
System.out.print((char) (index + 'A' - 27));
}
index++;
flag = true;
this.notify();
}
}
public static void main(String[] args) {
Inner inner = new Inner();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 52; i++) {
inner.printNum();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 52; i++) {
inner.printChar();
}
}
}).start();
}
}
b. Semaphore
public class NumberSemaphoreDemo {
static class Inner {
private Semaphore semaphore = new Semaphore(1);
private int count = 1;
private int index = 1;
public synchronized void printNum() {
try {
semaphore.acquire();
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(count++);
semaphore.release();
this.notify();
}
public synchronized void printChar() {
try {
semaphore.acquire();
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (index < 27) {
System.out.print((char) (index + 'a' - 1));
} else {
System.out.print((char) (index + 'A' - 27));
}
index++;
semaphore.release();
this.notify();
}
}
public static void main(String[] args) {
NumberDemo.Inner inner = new NumberDemo.Inner();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 52; i++) {
inner.printNum();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 52; i++) {
inner.printChar();
}
}
}).start();
}
}