package cn.everest.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ShareDateAndThreadPool {
public static void main(String[] args) {
Resource resource = new Resource();
IncreData increData = new IncreData(resource);
DecreData decreData = new DecreData(resource);
ExecutorService threadPool1 = Executors.newCachedThreadPool();
ExecutorService threadPool2 = Executors.newCachedThreadPool();
for (int i = 0; i < 2; i++) {
threadPool1.execute(increData);
}
for (int i = 0; i < 2; i++) {
threadPool2.execute(decreData);
}
threadPool1.shutdown();
threadPool2.shutdown();
} // end main
} // end ShareDateAndThreadPool
class IncreData implements Runnable {
private Resource resource;
public IncreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.increment();
}
}
}
class DecreData implements Runnable {
private Resource resource;
public DecreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.decrement();
}
}
}
class Resource {
private int x = 0;
private boolean flag = false;
public Resource() {
}
final Lock lock = new ReentrantLock();
Condition increCondition = lock.newCondition();
Condition decreCondition = lock.newCondition();
public void increment() {
lock.lock();
try {
while (flag) {
increCondition.await();
}
x = x + 1;
System.out.println(Thread.currentThread().getName() + " x +++++++++++++++++++++++: " + x);
flag = !flag;
decreCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} // end increment
public void decrement() {
lock.lock();
try {
while (!flag) {
decreCondition.await();
}
x = x - 1;
System.out.println(Thread.currentThread().getName() + " x ------------: " + x);
flag = !flag;
increCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} // end decrement
} // end Resource