独立写了一个生产消费者的模式,加强理解多线程编程及线程间的同步及信息交换。
要点:
1、在启动线程时,先需启动生产者。
2、生产者生产满了后,就不能再生产,进入等待状态,直到有消费者进行消费。
3、消费者进行消费时,若没有,则不能进行消费,进入等待状态。直到生产者生产了。
public class TestProduct {
public static void main(String[] args){
final Product pro = new Product();
ExecutorService service = Executors.newCachedThreadPool();
for(int j=0; j<2; j++){
new Thread(){
public void run()
{
pro.putEgg();
//pro.getEgg();
};
}.start();
for(int i=0; i<2; i++){
new Thread(){
public void run()
{
pro.getEgg();
//pro.putEgg();
};
}.start();
}
}
}
}
public class Product {
private boolean flag = true;// true:盘中没有鸡蛋,false 盘中有鸡蛋
//盘中有鸡蛋则唤醒其它的线程可以来取了,盘中无鸡蛋,则此于等待状态,等着来放鸡蛋。
//放鸡蛋
public synchronized void putEgg(){
//如果盘中没有鸡蛋
if(flag){
flag = false;
System.out.println(Thread.currentThread().getName()+" 盘中放入了一个鸡蛋了,可以取鸡蛋了");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();
}
//取鸡蛋
public synchronized String getEgg()
{
//如果有鸡蛋,则取出鸡蛋
String jidan;
if(!flag)
{
System.out.println(Thread.currentThread().getName()+" 已经取出来一个鸡蛋了");
flag = true;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();
return null;
}
}
要点:
1、在启动线程时,先需启动生产者。
2、生产者生产满了后,就不能再生产,进入等待状态,直到有消费者进行消费。
3、消费者进行消费时,若没有,则不能进行消费,进入等待状态。直到生产者生产了。
public class TestProduct {
public static void main(String[] args){
final Product pro = new Product();
ExecutorService service = Executors.newCachedThreadPool();
for(int j=0; j<2; j++){
new Thread(){
public void run()
{
pro.putEgg();
//pro.getEgg();
};
}.start();
for(int i=0; i<2; i++){
new Thread(){
public void run()
{
pro.getEgg();
//pro.putEgg();
};
}.start();
}
}
}
}
public class Product {
private boolean flag = true;// true:盘中没有鸡蛋,false 盘中有鸡蛋
//盘中有鸡蛋则唤醒其它的线程可以来取了,盘中无鸡蛋,则此于等待状态,等着来放鸡蛋。
//放鸡蛋
public synchronized void putEgg(){
//如果盘中没有鸡蛋
if(flag){
flag = false;
System.out.println(Thread.currentThread().getName()+" 盘中放入了一个鸡蛋了,可以取鸡蛋了");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();
}
//取鸡蛋
public synchronized String getEgg()
{
//如果有鸡蛋,则取出鸡蛋
String jidan;
if(!flag)
{
System.out.println(Thread.currentThread().getName()+" 已经取出来一个鸡蛋了");
flag = true;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();
return null;
}
}