多线程 同步synchronized、通信wait、notify

来源:互联网 发布:ubuntu安装perl模块 编辑:程序博客网 时间:2024/05/16 12:16

/*
 * 生产者将产品交给店员,二消费者从店员处取走产品;
 * 店员持有的产品数量不超过20,如果超过20叫生产者停一下,少于20就继续生产;
 * 如果店员持有的数量为0,让消费者稍等下,一有产品就通知消费者;
 * 
 * 分析:
 * 是否有涉及到多线程?有,生产者和消费者;
 * 是否有涉及到共享数据?有,产品数量,别忘了线程安全;
 * 是否有涉及到通信?有,生产者和消费者之间的通信;
 */
public class Test 
{
public static void main(String[] args) 
{
Clerk clerk = new Clerk();
Producter p = new Producter(clerk);
Customers c = new Customers(clerk);

Thread t1 = new Thread(p);
Thread t2 = new Thread(c);


t1.start();
t2.start();
}
}


//店员,管理商品数量;
class Clerk
{
int num = 0;
public synchronized void addClerk()
{
if(num >= 20)
{
try 
{
wait(); //商品数量超过20就进入等待,即暂停生产;
} catch (InterruptedException e) 
{
e.printStackTrace();
}
}
else
{
try 
{
Thread.sleep(10);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
System.out.println("生产者生产后的数量:" + num);
num++;
notifyAll(); //将进入等待状态的cosumeClerk唤醒;  
}

}
public synchronized void cosumeClerk()
{
if(num < 1)
{
try 
{
wait();//商品数量为0时就进入等待状态;
} catch (InterruptedException e) 
{
e.printStackTrace();
}  
}
else
{
System.out.println("消费者消费后的数量:" + num);
num--;
notifyAll(); //将进入等待状态的addClerk唤醒;
}
}
}


//生产者;
class Producter implements Runnable
{
Clerk clerk;
public Producter(Clerk clerk)
{
this.clerk = clerk;
}
public void run()
{
while(true)
{
try 
{
Thread.sleep(100);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
clerk.addClerk();
}
}

}


//消费者;
class Customers implements Runnable
{
Clerk clerk;
public Customers(Clerk clerk)
{
this.clerk = clerk;
}
public void run() 
{
while(true)
{
try 
{
Thread.sleep(50);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
clerk.cosumeClerk();
}
}
}







































0 0
原创粉丝点击