问题
N个线程交替打印0-100个数字,例如N=3,如下输出
- Thread-0 0
- Thread-1 1
- Thread-2 2
- Thread-0 3
解决方案1
class SyncWaitNotify {
/**
* 当前索引
*/
private int currentIndex;
/**
* 循环总数
*/
private int loopCount;
/**
* 线程总数
*/
private int threadCount;
public SyncWaitNotify(int loopCount, int threadCount,int currentIndex){
this.loopCount = loopCount;
this.threadCount = threadCount;
this.currentIndex = currentIndex;
}
public void print(int printFlag){
synchronized (this){
while(true){
while (currentIndex % threadCount != printFlag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notifyAll();
if(currentIndex > loopCount){
currentIndex++;
break;
}
System.out.println(Thread.currentThread().getName()+"---"+currentIndex++);
}
}
}
}
public static void main(String[] args) {
int loopCount =100;
int threadCount = 4;
int currentIndex = 0;
SyncWaitNotify syncWaitNotify = new SyncWaitNotify(loopCount, threadCount,currentIndex);
for (int i = 0; i < threadCount; i++) {
int finalI = i;
new Thread(()->{
syncWaitNotify.print(finalI);
}).start();
}
}
解决方法2
class LookWaitNotify {
/**
* 当前索引
*/
private int currentIndex;
/**
* 循环总数
*/
private int loopCount;
/**
* 线程总数
*/
private int threadCount;
private ReentrantLock reentrantLock;
private List<Condition> conditionList;
public LookWaitNotify(int currentIndex, int loopCount, int threadCount) {
this.currentIndex = currentIndex;
this.loopCount = loopCount;
this.threadCount = threadCount;
this.reentrantLock = new ReentrantLock();
conditionList = new ArrayList<>();
for (int i = 0; i < threadCount; i++) {
Condition condition = reentrantLock.newCondition();
conditionList.add(condition);
}
}
public void print(int printFlag) {
reentrantLock.lock();
try {
while (true) {
while (currentIndex % threadCount != printFlag) {
try {
conditionList.get(printFlag).await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
conditionList.get((printFlag + 1) % conditionList.size()).signalAll();
if(currentIndex > loopCount){
currentIndex++;
break;
}
System.out.println(Thread.currentThread().getName() + "---" + currentIndex++);
}
} finally {
reentrantLock.unlock();
}
}
}
public static void main(String[] args) {
int loopCount = 100;
int threadCount = 4;
int currentIndex = 0;
LookWaitNotify lookWaitNotify = new LookWaitNotify(currentIndex, loopCount, threadCount);
for (int i = 0; i < threadCount; i++) {
int finalI = i;
new Thread(() -> lookWaitNotify.print(finalI)).start();
}
}