Java生产者和消费者问题
2014-03-15 17:03
351 查看
import java.util.*;
public class ProductCustoms {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start();
new Thread(c).start();
}
}
class Tomato
{
int id;
Tomato(int id)
{
this.id=id;
}
public String toString()
{
return "WoTou:"+id;
}
}
class SyncStack
{
int index=0;
Tomato[] arrWT=new Tomato[6];
public synchronized void push(Tomato wt)
{
while(index==arrWT.length)//防止catch到异常,再去检查;
{
try {
this.wait();//当前的正在访问这个对象的线程wait;只有方法被锁才能wait
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();//谁现在正在对象上等待就叫醒一个线程让它继续执行;
arrWT[index++]=wt;
}
public synchronized Tomato pop()
{
while(index==0)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arrWT[index];
}
}
class Producer implements Runnable
{
SyncStack ss = null;
Producer(SyncStack ss)
{
this.ss=ss;
}
public void run() {
for(int i=0;i<20;i++)
{
Tomato wt = new Tomato(i);
ss.push(wt);
System.out.println("生产了:"+wt);
try {
Thread.sleep((long) (Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable
{
SyncStack ss = null;
Consumer(SyncStack ss)
{
this.ss=ss;
}
public void run() {
for(int i=0;i<20;i++)
{
Tomato wt=ss.pop();
System.out.println("消费了:"+wt);
try {
Thread.sleep((long) (Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ProductCustoms {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start();
new Thread(c).start();
}
}
class Tomato
{
int id;
Tomato(int id)
{
this.id=id;
}
public String toString()
{
return "WoTou:"+id;
}
}
class SyncStack
{
int index=0;
Tomato[] arrWT=new Tomato[6];
public synchronized void push(Tomato wt)
{
while(index==arrWT.length)//防止catch到异常,再去检查;
{
try {
this.wait();//当前的正在访问这个对象的线程wait;只有方法被锁才能wait
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();//谁现在正在对象上等待就叫醒一个线程让它继续执行;
arrWT[index++]=wt;
}
public synchronized Tomato pop()
{
while(index==0)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arrWT[index];
}
}
class Producer implements Runnable
{
SyncStack ss = null;
Producer(SyncStack ss)
{
this.ss=ss;
}
public void run() {
for(int i=0;i<20;i++)
{
Tomato wt = new Tomato(i);
ss.push(wt);
System.out.println("生产了:"+wt);
try {
Thread.sleep((long) (Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable
{
SyncStack ss = null;
Consumer(SyncStack ss)
{
this.ss=ss;
}
public void run() {
for(int i=0;i<20;i++)
{
Tomato wt=ss.pop();
System.out.println("消费了:"+wt);
try {
Thread.sleep((long) (Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
相关文章推荐
- 安装JDK出现"Windows Installer程序包有问题,此安装需要的DLL不能运行"解决方法
- java.math.BigDecimal类的用法
- struts2自学笔记之二
- Struts2用DomainModel接收参数
- SpringMVC+Hibernate
- 将eclipse新建项目的默认编码GBK改为UTF-8
- JAVA求不惑 之 不要在构造器内调用有多态行为的方法
- java的一些开源!
- Java.util.Properties类
- JAVA中toString方法的作用
- Eclipse快捷键操作大全
- java web学习1
- JAVA 对象序列化——Serializable
- Java——流程控制2
- VM下配置JDK,SDK,NDK的步骤
- java中静态成员函数&单例设计模式
- 如何把一个java工程打成一个jar包(转载)
- Java数组
- 关于java面向对象的理解
- Java面向对象之静态