/*
需求:定义一个线程间通信的程序,在其中加入等待唤醒机制,采用同步机制,保证代码
      的安全性;
思路:定义一个生产者类和一个消费者类,这两个类实现Runnable接口,实现多线程;
  在定义一个资源类,生产者类和消费者类操作的数据资源就是该类对象;
步骤:
*/
package productiontest2;
class Resource 
{
private int count=0;
private boolean flag=false;
public void setFlag()
{
flag=!flag;
}
public boolean getFlag()
{
return flag;
}
public void setCount()
{
++count;
}
public int getCount()
{
return count;
}
public synchronized void produce()
{
if(getFlag())
try
{
wait();
}
catch(Exception e )
{

}
        setCount();
        System.out.println(Thread.currentThread().getName()+"生产者"+getCount());
setFlag();
notify();
}
public synchronized void consume()
{
if(!getFlag())
   try
   {
   wait();
   }
   catch(Exception e  )
   {

   }
        System.out.println(Thread.currentThread().getName()+"消费者*****************************"+getCount());
setFlag();
notify();
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
res.produce();
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
res.consume();
}
}
class ProductionTest
{
public static void main(String []args)
{
Resource r=new Resource();
Producer pro=new Producer(r);
Consumer con=new Consumer(r);
Thread t1=new Thread(pro);
Thread t2=new Thread(pro);
Thread t3=new Thread(con);
Thread t4=new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
结果:
D:\javaprog\809>java productiontest2.ProductionTe
Thread-0生产者1
Thread-3消费者*****************************1
Thread-1生产者2
Thread-2消费者*****************************2
Thread-0生产者3
Thread-3消费者*****************************3
Thread-1生产者4
Thread-2消费者*****************************4
Thread-0生产者5
Thread-3消费者*****************************5
Thread-1生产者6
Thread-2消费者*****************************6
Thread-0生产者7
Thread-3消费者*****************************7
Thread-1生产者8
Thread-2消费者*****************************8
Thread-0生产者9
Thread-3消费者*****************************9
Thread-1生产者10
Thread-2消费者*****************************10
Thread-0生产者11
Thread-3消费者*****************************11
Thread-1生产者12
Thread-2消费者*****************************12
Thread-0生产者13
Thread-3消费者*****************************13
Thread-1生产者14
Thread-2消费者*****************************14
Thread-0生产者15
Thread-3消费者*****************************15
Thread-1生产者16
Thread-2消费者*****************************16
Thread-0生产者17
Thread-3消费者*****************************17

第二个程序
/*
需求:定义一个线程间通信的程序,在其中加入等待唤醒机制,采用同步机制,保证代码
      的安全性;
思路:定义一个生产者类和一个消费者类,这两个类实现Runnable接口,实现多线程;
  在定义一个资源类,生产者类和消费者类操作的数据资源就是该类对象;
步骤:
*/
package productiontest;
class Resource 
{
private int count=0;
private boolean flag=false;
public void setFlag()
{
flag=!flag;
}
public boolean getFlag()
{
return flag;
}
public void setCount()
{
++count;
}
public int getCount()
{
return count;
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
produce();
}
public synchronized void produce()
{
if(res.getFlag())
try
{
res.wait();
}
catch(Exception e)
{ }
        res.setCount();
System.out.println(Thread.currentThread().getName()+"生产者..."+res.getCount());
res.setFlag();
res.notify();
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
consume();
}
public synchronized void consume()
{
if(!res.getFlag())
try
{
res.wait();
}
catch(Exception e )
{
} System.out.println(Thread.currentThread().getName()+"消费者......"+res.getCount());
res.setFlag();
res.notify();
}
}
class ProductionTest
{
public static void main(String []args)
{
Resource r=new Resource();
Producer pro=new Producer(r);
Consumer con=new Consumer(r);
Thread t1=new Thread(pro);
Thread t2=new Thread(con);
t1.start();
t2.start();
}
}
D:\javaprog\809>java productiontest.ProductionTest
Thread-1消费者......0
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at productiontest.Consumer.consume(ProductionTest.java:82)Thread-0生        at productiontest.Consumer.run(ProductionTest.java:67)
        at java.lang.Thread.run(Thread.java:722)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at productiontest.Producer.produce(ProductionTest.java:55)
        at productiontest.Producer.run(ProductionTest.java:39)
        at java.lang.Thread.run(Thread.java:722)
这两个程序有什么不同啊?为什么啊?