3つのスレッドを交互に1〜99を印刷
T1、T2、スレッドを印刷としてT3
T1 :. 1
T2:2
T3 :. 3
T1 :. 4
T2 ...
実現
アイデア:スレッドをロックする共有リソースの動作を保証する共有リソース、各スレッドは、印刷後にウェイクアップ時間を実行し、糸の端部が閉塞状態で印刷することができないことを保証するために
public class PrintHundred {
public static void main(String[] args) {
Resource resource = new Resource();
List<Runnable> runList = new ArrayList<>();
runList.add(() -> {
resource.printNnm(resource.firstCondition, resource.secondCondition);
});
runList.add(() -> {
resource.printNnm(resource.secondCondition, resource.thridCondition);
});
runList.add(() -> {
resource.printNnm(resource.thridCondition, resource.firstCondition);
});
for (int i = 1; i <= runList.size(); i++) {
new Thread(runList.get(i - 1), "" + i).start();
}
}
static class Resource {
int num = 0; // 初始值
Lock lock = new ReentrantLock();
Condition firstCondition = lock.newCondition();
Condition secondCondition = lock.newCondition();
Condition thridCondition = lock.newCondition();
public void printNnm(Condition self, Condition next) {
lock.lock();
try {
// 打印到99
while (num < 99) {
num += 1;
System.out.println("线程" + Thread.currentThread().getName() + "打印num当前值" + num);
next.signal();
self.await();
}
// 最后一个打印99结束也要唤醒下一个线程,保证下一个线程不在阻塞状态
next.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}