synchronized实现
public class TestProducerAndConsumer {
public static void main ( String[ ] args) {
Resource resource = new Resource ( ) ;
ProducerThread p1 = new ProducerThread ( resource) ;
ConsumerThread c1 = new ConsumerThread ( resource) ;
p1. start ( ) ;
c1. start ( ) ;
}
}
class Resource {
private int num = 0 ;
private int size = 1 ;
public synchronized void remove ( ) {
if ( num > 0 ) {
System. out. println ( "消费者" + Thread. currentThread ( ) . getName ( ) + "消耗一件资源," + "当前线程池有" + -- num + "个" ) ;
this . notifyAll ( ) ;
} else {
try {
this . wait ( ) ;
System. out. println ( "消费者" + Thread. currentThread ( ) . getName ( ) + "线程进入等待状态" ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
public synchronized void add ( ) {
if ( num < size) {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "生产一件资源,当前资源池有" + ++ num + "个" ) ;
this . notifyAll ( ) ;
} else {
try {
this . wait ( ) ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "线程进入等待" ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
class ConsumerThread extends Thread {
private Resource resource;
public ConsumerThread ( Resource resource) {
this . resource = resource;
}
@Override
public void run ( ) {
while ( true ) {
try {
Thread. sleep ( 200 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
resource. remove ( ) ;
}
}
}
class ProducerThread extends Thread {
private Resource resource;
public ProducerThread ( Resource resource) {
this . resource = resource;
}
@Override
public void run ( ) {
while ( true ) {
try {
Thread. sleep ( 200 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
resource. add ( ) ;
}
}
}
lock & Condition结合
class Resource {
private int num = 0 ;
private int size = 1 ;
private Lock lock = new ReentrantLock ( ) ;
private Condition condition = lock. newCondition ( ) ;
public void remove ( ) {
lock. lock ( ) ;
try {
if ( num > 0 ) {
System. out. println ( "消费者" + Thread. currentThread ( ) . getName ( ) + "消耗一件资源," + "当前线程池有" + -- num + "个" ) ;
condition. signalAll ( ) ;
} else {
try {
condition. await ( ) ;
System. out. println ( "消费者" + Thread. currentThread ( ) . getName ( ) + "线程进入等待状态" ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} finally {
lock. unlock ( ) ;
}
}
public void add ( ) {
lock. lock ( ) ;
try {
if ( num < size) {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "生产一件资源,当前资源池有" + ++ num + "个" ) ;
condition. signalAll ( ) ;
} else {
try {
condition. await ( ) ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "线程进入等待" ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} finally {
lock. unlock ( ) ;
}
}
}
class ConsumerThread extends Thread {
private Resource resource;
public ConsumerThread ( Resource resource) {
this . resource = resource;
}
@Override
public void run ( ) {
while ( true ) {
try {
Thread. sleep ( 200 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
resource. remove ( ) ;
}
}
}
class ProducerThread extends Thread {
private Resource resource;
public ProducerThread ( Resource resource) {
this . resource = resource;
}
@Override
public void run ( ) {
while ( true ) {
try {
Thread. sleep ( 200 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
resource. add ( ) ;
}
}
}