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

用多线程模拟生产零件系统程序 _生产_08    
private boolean flag=true;
用多线程模拟生产零件系统程序 _生产_15    
public int getNum() {
用多线程模拟生产零件系统程序 _生产_08        
return num;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _休闲_20    
public void setNum(int num) {
用多线程模拟生产零件系统程序 _生产_08        
this.num = num;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _系统程序_25    
public String getName() {
用多线程模拟生产零件系统程序 _生产_08        
return name;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _系统程序_30    
public void setName(String name) {
用多线程模拟生产零件系统程序 _生产_08        
this.name = name;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _生产_08    
public synchronized void set(int num,String name)
用多线程模拟生产零件系统程序 _休闲_36    
{
用多线程模拟生产零件系统程序 _生产_08        
if(!flag)
用多线程模拟生产零件系统程序 _系统程序_40        
{
用多线程模拟生产零件系统程序 _系统程序_43            
try {
用多线程模拟生产零件系统程序 _生产_08                
//工人在取零件,机器暂停工作
用多线程模拟生产零件系统程序 _生产_08
                wait();
用多线程模拟生产零件系统程序 _生产_08                System.out.println(
"工人正在取零件,等会在生产");
用多线程模拟生产零件系统程序 _生产_08                Thread.sleep(
1000);
用多线程模拟生产零件系统程序 _线程_50            }
 catch (InterruptedException e) {
用多线程模拟生产零件系统程序 _生产_08                e.printStackTrace();
用多线程模拟生产零件系统程序 _休闲_13            }

用多线程模拟生产零件系统程序 _休闲_13        }

用多线程模拟生产零件系统程序 _生产_08        
//机器生产零件
用多线程模拟生产零件系统程序 _生产_08
        this.setNum(num);
用多线程模拟生产零件系统程序 _生产_08        
this.setName(name);
用多线程模拟生产零件系统程序 _生产_08        
//修改标志位,使工人开始工作
用多线程模拟生产零件系统程序 _生产_08
        flag=false;
用多线程模拟生产零件系统程序 _生产_08        
//唤醒等待的线程
用多线程模拟生产零件系统程序 _生产_08
        notify();
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _生产_08    
public synchronized void get()
用多线程模拟生产零件系统程序 _系统程序_65    
{
用多线程模拟生产零件系统程序 _生产_08        
if(flag)
用多线程模拟生产零件系统程序 _生产_69        
{
用多线程模拟生产零件系统程序 _生产_72            
try {
用多线程模拟生产零件系统程序 _生产_08                
//flag=true;机器正在生产零件,工人先休息会
用多线程模拟生产零件系统程序 _生产_08
                System.out.println("机器正在生产零件,请稍等");
用多线程模拟生产零件系统程序 _生产_08                wait();
用多线程模拟生产零件系统程序 _生产_08                Thread.sleep(
1000);
用多线程模拟生产零件系统程序 _线程_79            }
 catch (InterruptedException e) {
用多线程模拟生产零件系统程序 _生产_08                e.printStackTrace();
用多线程模拟生产零件系统程序 _休闲_13            }

用多线程模拟生产零件系统程序 _休闲_13        }

用多线程模拟生产零件系统程序 _生产_08        
//工人取零件,机器休息
用多线程模拟生产零件系统程序 _生产_08
        System.out.println("零件号: "+this.getNum()+"--->零件名称: "+this.getName());
用多线程模拟生产零件系统程序 _生产_08        
//修改标志位,使机器开始工作
用多线程模拟生产零件系统程序 _生产_08
        flag=true;
用多线程模拟生产零件系统程序 _生产_08        
//唤醒等待的线程
用多线程模拟生产零件系统程序 _生产_08
        notify();
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _休闲_92}
 
用多线程模拟生产零件系统程序 _系统程序_02
用多线程模拟生产零件系统程序 _系统程序_02
//生产零件
用多线程模拟生产零件系统程序 _系统程序_02
class Produce implements Runnable//机器
用多线程模拟生产零件系统程序 _模拟_96
{
用多线程模拟生产零件系统程序 _生产_08    
private LingJian lj=null;
用多线程模拟生产零件系统程序 _生产_08    
public Produce(LingJian lj)
用多线程模拟生产零件系统程序 _模拟_101    
{
用多线程模拟生产零件系统程序 _生产_08        
this.lj=lj;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _生产_08    
public void run()
用多线程模拟生产零件系统程序 _生产_107    
{
用多线程模拟生产零件系统程序 _生产_08        
int i=0;
用多线程模拟生产零件系统程序 _生产_08        
while(true)
用多线程模拟生产零件系统程序 _生产_112        
{
用多线程模拟生产零件系统程序 _生产_08            
if(i==0)
用多线程模拟生产零件系统程序 _模拟_116            
{
用多线程模拟生产零件系统程序 _生产_08                lj.set(
1,"车轮");
用多线程模拟生产零件系统程序 _生产_08                i
=1;
用多线程模拟生产零件系统程序 _休闲_13            }

用多线程模拟生产零件系统程序 _生产_08            
if(i==1)
用多线程模拟生产零件系统程序 _生产_123            
{
用多线程模拟生产零件系统程序 _生产_08                lj.set(
2,"车轴");
用多线程模拟生产零件系统程序 _生产_08                i
=0;
用多线程模拟生产零件系统程序 _休闲_13            }

用多线程模拟生产零件系统程序 _休闲_13        }

用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _休闲_92}
 
用多线程模拟生产零件系统程序 _系统程序_02
用多线程模拟生产零件系统程序 _系统程序_02
//工人取零件
用多线程模拟生产零件系统程序 _系统程序_02
class Consume implements Runnable//工人
用多线程模拟生产零件系统程序 _休闲_135
{
用多线程模拟生产零件系统程序 _生产_08    
private LingJian lj=null;
用多线程模拟生产零件系统程序 _生产_08    
public Consume(LingJian lj)
用多线程模拟生产零件系统程序 _系统程序_140    
{
用多线程模拟生产零件系统程序 _生产_08        
this.lj=lj;
用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _生产_08    
public void run()
用多线程模拟生产零件系统程序 _模拟_146    
{
用多线程模拟生产零件系统程序 _生产_08        
while(true)
用多线程模拟生产零件系统程序 _休闲_150        
{
用多线程模拟生产零件系统程序 _生产_08            lj.get();
用多线程模拟生产零件系统程序 _休闲_13        }

用多线程模拟生产零件系统程序 _休闲_13    }

用多线程模拟生产零件系统程序 _休闲_92}
 
用多线程模拟生产零件系统程序 _系统程序_02
用多线程模拟生产零件系统程序 _系统程序_02
//测试类
用多线程模拟生产零件系统程序 _线程_159
public class LingJianDemo {
用多线程模拟生产零件系统程序 _生产_08    
public static void main(String args[])
用多线程模拟生产零件系统程序 _休闲_163    
{
用多线程模拟生产零件系统程序 _生产_08        
//构建一个零件实例对象
用多线程模拟生产零件系统程序 _生产_08
        LingJian lj=new LingJian();
用多线程模拟生产零件系统程序 _生产_08        Produce pro
=new Produce(lj);
用多线程模拟生产零件系统程序 _生产_08        Consume cse
=new Consume(lj);
用多线程模拟生产零件系统程序 _生产_08        
new Thread(cse).start();
用多线程模拟生产零件系统程序 _生产_08        
new Thread(pro).start();
用多线程模拟生产零件系统程序 _休闲_13    }
 
用多线程模拟生产零件系统程序 _生产_08
用多线程模拟生产零件系统程序 _休闲_92}
 
用多线程模拟生产零件系统程序 _系统程序_02
用多线程模拟生产零件系统程序 _系统程序_02
此程序的输出结果如图:
用多线程模拟生产零件系统程序 _系统程序_177
这个程序涉及到并发多线程,多个线程共享一个资源,如果每个线程在同一时间同时修改这个资源那么势必会造成资源信息的不正确,为了防止这种情况发生,我们在此程序中定义了两个同步方法来给这个资源加上一把锁,在一个时间点上只能有一个线程使用这个资源,其他线程等待。