java併発ツールバッグ-Condation
12415 ワード
1.conditionを使って生産者-消費者モードを作る CondationとLockを組み合わせて使う.conditionは、 とwaitnotify似ています必要な要求も同じです.ロックに保管しなければなりません.異常がないように投げます.
lock.newCondition();
を使用してconditionを作成しなければならない./**
* Condition - .
*/
public class ConditionDemo {
private static final Lock lock = new ReentrantLock();
// lock condition.
private static final Condition condition = lock.newCondition();
private static int data = 0;
private static final AtomicBoolean noUseData = new AtomicBoolean(false);
public static void main(String[] args) {
IntStream.rangeClosed(1, 10).forEach(item -> {
new Thread(ConditionDemo::createData).start();
});
IntStream.rangeClosed(1, 10).forEach(item -> {
new Thread(ConditionDemo::useData).start();
});
}
private static void createData() {
try {
lock.lock();
while (noUseData.get()) {
condition.await();
}
TimeUnit.SECONDS.sleep(2);
data++;
System.out.println(Thread.currentThread().getName() + " - P -> " + data);
noUseData.set(true);
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private static void useData() {
try {
lock.lock();
while (!noUseData.get()) {
condition.await();
}
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + " - C -> " + data);
noUseData.set(false);
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}