线程交替执行
Runnable numberPrint = new Runnable ( ) {
private int i = 0 ;
@Override
public void run ( ) {
while ( true ) {
synchronized ( this ) {
this . notify ( ) ;
if ( i < 100 ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + ": " + i) ;
i++ ;
try {
this . wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
} else {
break ;
}
}
}
}
} ;
Thread t1 = new Thread ( numberPrint) ;
t1. setName ( "print-1" ) ;
Thread t2 = new Thread ( numberPrint) ;
t2. setName ( "print-2" ) ;
t1. start ( ) ;
t2. start ( ) ;
生产者与消费者
public class ProductFactory {
private int productCount = 0 ;
public synchronized void produce ( ) {
if ( productCount < 10 ) {
productCount++ ;
System . out. println ( "produce product " + productCount) ;
notifyAll ( ) ;
} else {
try {
wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
public synchronized void consume ( ) {
if ( productCount > 0 ) {
System . out. println ( "consume product " + productCount) ;
productCount-- ;
notifyAll ( ) ;
} else {
try {
wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
public class Producer implements Runnable {
private ProductFactory factory;
public Producer ( ProductFactory factory) {
this . factory = factory;
}
@Override
public void run ( ) {
while ( true ) {
factory. produce ( ) ;
}
}
}
public class Consumer implements Runnable {
private ProductFactory factory;
public Consumer ( ProductFactory factory) {
this . factory = factory;
}
@Override
public void run ( ) {
while ( true ) {
factory. consume ( ) ;
}
}
}
public static void main ( String [ ] args) {
ProductFactory factory = new ProductFactory ( ) ;
Producer producer1 = new Producer ( factory) ;
Producer producer2 = new Producer ( factory) ;
Consumer consumer1 = new Consumer ( factory) ;
Consumer consumer2 = new Consumer ( factory) ;
Thread producer1Thread = new Thread ( producer1) ;
Thread producer2Thread = new Thread ( producer2) ;
Thread consumer1Thread = new Thread ( consumer1) ;
Thread consumer2Thread = new Thread ( consumer2) ;
producer1Thread. start ( ) ;
producer2Thread. start ( ) ;
consumer1Thread. start ( ) ;
consumer2Thread. start ( ) ;
}