要求: 机器生产零件,工人取走零件,机器先生产一个1号零件,工人取走一个1号零件,机器再生产一个2号零件,工人再取走,然后机器生产一个1号零件,工人取走,机器再生产一个2号零件,工人取走,就这样依次交替。在机器生产零件的时候,工人禁止取零件;在工人取零件的时候,机器禁止生产零件。
生产状态图如下:
1
程序代码如下:
 
package  com.dr.runnable3;
// 零件类
class  LingJian
{
    
private int num=1;
    
private String name="车轮";
    
/**//*
     * falg=true;表示机器正在生产零件,否则表示工人正在取零件
     
*/

    
private boolean flag=true;
    
public int getNum() {
        
return num;
    }

    
public void setNum(int num) {
        
this.num = num;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public synchronized void set(int num,String name)
    
{
        
if(!flag)
        
{
            
try {
                
//工人在取零件,机器暂停工作
                wait();
                System.out.println(
"工人正在取零件,等会在生产");
                Thread.sleep(
1000);
            }
 catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

        
//机器生产零件
        this.setNum(num);
        
this.setName(name);
        
//修改标志位,使工人开始工作
        flag=false;
        
//唤醒等待的线程
        notify();
    }

    
public synchronized void get()
    
{
        
if(flag)
        
{
            
try {
                
//flag=true;机器正在生产零件,工人先休息会
                System.out.println("机器正在生产零件,请稍等");
                wait();
                Thread.sleep(
1000);
            }
 catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

        
//工人取零件,机器休息
        System.out.println("零件号: "+this.getNum()+"--->零件名称: "+this.getName());
        
//修改标志位,使机器开始工作
        flag=true;
        
//唤醒等待的线程
        notify();
    }

}
 

// 生产零件
class  Produce  implements  Runnable // 机器
{
    
private LingJian lj=null;
    
public Produce(LingJian lj)
    
{
        
this.lj=lj;
    }

    
public void run()
    
{
        
int i=0;
        
while(true)
        
{
            
if(i==0)
            
{
                lj.set(
1,"车轮");
                i
=1;
            }

            
if(i==1)
            
{
                lj.set(
2,"车轴");
                i
=0;
            }

        }

    }

}
 

// 工人取零件
class  Consume  implements  Runnable // 工人
{
    
private LingJian lj=null;
    
public Consume(LingJian lj)
    
{
        
this.lj=lj;
    }

    
public void run()
    
{
        
while(true)
        
{
            lj.get();
        }

    }

}
 

// 测试类
public   class  LingJianDemo  {
    
public static void main(String args[])
    
{
        
//构建一个零件实例对象
        LingJian lj=new LingJian();
        Produce pro
=new Produce(lj);
        Consume cse
=new Consume(lj);
        
new Thread(cse).start();
        
new Thread(pro).start();
    }
 

}
 

此程序的输出结果如图:
2
这个程序涉及到并发多线程,多个线程共享一个资源,如果每个线程在同一时间同时修改这个资源那么势必会造成资源信息的不正确,为了防止这种情况发生,我们在此程序中定义了两个同步方法来给这个资源加上一把锁,在一个时间点上只能有一个线程使用这个资源,其他线程等待。

1

收藏

冯魁

52篇文章,26W+人气,0粉丝