- Java code
class ProductorConsumer{ public static void main( String args[] ) { Resource res=new Resource();// 创建共享资源 new Thread( new Productor(res) ).start(); new Thread( new Consumer(res) ).start(); }}class Resource{ private int account=0; private boolean flag=false; public void product() { account++; System.out.println(Thread.currentThread().getName()+"生产"+account); } public void pay() { System.out.println("/t/t/t"+Thread.currentThread().getName()+"消费"+account); }}class Productor implements Runnable{ private Resource res; Productor(Resource res) { this.res=res; } public synchronized void run() { while(res.flag) try { wait(); } catch (Exception e) { System.out.println("error"); } res.product(); res.flag=true; this.notifyAll(); }}class Consumer implements Runnable{ private Resource res; Consumer( Resource res ) { this.res=res; } public synchronized void run() { while(!res.flag) try { wait(); } catch ( Exception e ) { System.out.println("error"); } res.pay(); res.flag=false; this.notifyAll(); }}
ProductorConsumer.java:34: 错误: flag可以在Resource中访问private
? while(res.flag)
? ^
ProductorConsumer.java:44: 错误: flag可以在Resource中访问private
? res.flag=true;
? ^
ProductorConsumer.java:57: 错误: flag可以在Resource中访问private
? while(!res.flag)
? ^
ProductorConsumer.java:67: 错误: flag可以在Resource中访问private
? res.flag=false;
------解决方案--------------------
class Resource {
? private int account=0;
? private boolean flag=false;
你这里flag是private,所以后面程序无法直接“res.flag”访问。
可以修改为:
boolean flag=false;
或
public boolean flag=false;