今天我们来做一道大厂面试的多线程:
看到题面,很容易想到生产消费者模型,可以将字母与数字分别视为生产者以及消费者,每当生产者或者消费者活动一次,则通知另一个线程,由此便很容易得到答案.
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionTest {
static Lock lock = new ReentrantLock();
static Thread numThread;
static Thread wordThread;
static Condition word = lock.newCondition();
static Condition num = lock.newCondition();
static int count = 26;
public static void main(String[] args) {
numThread = new num();
numThread.start();
wordThread = new word();
wordThread.start();
}
}
class word extends Thread {
public void run() {
for (int i = 0;i < ConditionTest.count;i++) {
try {
ConditionTest.lock.lock();
System.out.printf("%c\t",'A'+i);
ConditionTest.num.signalAll();
if (i != ConditionTest.count-1) {
ConditionTest.word.await();
}
ConditionTest.lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class num extends Thread {
public void run() {
try {
for (int i = 1;i <= ConditionTest.count;i++) {
ConditionTest.lock.lock();
System.out.print(i+"\t");
ConditionTest.word.signalAll();
if (i != ConditionTest.count) {
ConditionTest.num.await();
}
ConditionTest.lock.unlock();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过测试也可以验证我们的想法.