ReentrantLock、Condition打印字母问题
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ThreadUtil;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.IntStream;
public class TestLockCondition {
public static void main(String[] args) {
Executor executor = Executors.newFixedThreadPool(4);
ReentrantLock lock = new ReentrantLock();
Condition alphaCondition = lock.newCondition();
Condition numericCondition = lock.newCondition();
List<String> alphaQueue = Lists.newArrayList();
List<String> numericQueue = Lists.newArrayList();
IntStream.range(0, 26).forEach(i -> {
alphaQueue.add((char) ('A' + i) + "");
numericQueue.add((i + 1) + "");
});
executor.execute(() -> {
IntStream.range(0, 26).forEach(i -> {
try {
lock.lock();
String alpha = alphaQueue.get(i);
Console.print(alpha);
numericCondition.signal();
alphaCondition.awaitUninterruptibly();
} finally {
lock.unlock();
}
});
});
ThreadUtil.safeSleep(1000);
executor.execute(() -> {
IntStream.range(0, 26).forEach(i -> {
try {
lock.lock();
String num = numericQueue.get(i);
Console.print(num);
alphaCondition.signal();
if (i != 25) {
numericCondition.awaitUninterruptibly();
}
} finally {
lock.unlock();
}
});
});
}
}
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ThreadUtil;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;
public class TestLockCondition2 {
public static void main(String[] args) {
Executor executor = Executors.newFixedThreadPool(4);
Object alphaLock = new Object();
Object numericLock = new Object();
List<String> alphaQueue = Lists.newArrayList();
List<String> numericQueue = Lists.newArrayList();
IntStream.range(0, 26).forEach(i -> {
alphaQueue.add((char) ('A' + i) + "");
numericQueue.add((i + 1) + "");
});
executor.execute(() -> {
IntStream.range(0, 26).forEach(i -> {
synchronized (alphaLock) {
try {
String alpha = alphaQueue.get(i);
Console.print(alpha);
if (i != 0) {
synchronized (numericLock) {
numericLock.notify();
}
}
alphaLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
});
ThreadUtil.safeSleep(100);
executor.execute(() -> {
IntStream.range(0, 26).forEach(i -> {
synchronized (numericLock) {
try {
String num = numericQueue.get(i);
Console.print(num);
synchronized (alphaLock) {
alphaLock.notify();
}
if (i != 25) {
numericLock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
});
}
}