使用Condition来实现wait()和notify()
public class Main8 {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
MyService service = new MyService(lock);
new Thread8(service).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
service.signal();
}
public static class Thread8 extends Thread{
private MyService service;
public Thread8(MyService service) {
this.service = service;
}
@Override
public void run() {
System.out.println(System.currentTimeMillis());
service.await();
System.out.println(System.currentTimeMillis());
}
}
public static class MyService{
private Lock lock;
private Condition condition;
public MyService(Lock lock) {
this.lock = lock;
condition = lock.newCondition();
}
public void await(){
try {
lock.lock();
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void signal(){
try {
lock.lock();
condition.signal();
} finally {
lock.unlock();
}
}
}
}
模拟经典的生产者消费者场景:
/**
* 模拟多个生产者和消费者
*/
public class P_C {
public static void main(String[] args) {
MyService service = new MyService();
for (int i = 0; i < 10; i++) {
CThread c = new CThread(service);
c.setName("C"+i);
c.start();
PThread p = new PThread(service);
p.setName("P"+i);
p.start();
}
}
public static class PThread extends Thread{
private MyService service;
public PThread(MyService service) {
this.service = service;
}
@Override
public void run() {
super.run();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
service.set();
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static class CThread extends Thread{
private MyService service;
public CThread(MyService service) {
this.service = service;
}
@Override
public void run() {
super.run();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
service.get();
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static class MyService{
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean hasGoods = false;
public void get(){
try {
lock.lock();
while(hasGoods == false){
condition.await();
}
hasGoods = false;
System.out.println(Thread.currentThread().getName() + " 取货");
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void set(){
try {
lock.lock();
while(hasGoods == true){
condition.await();
}
System.out.println(Thread.currentThread().getName() + "生产");
hasGoods = true;
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}