Java中线程同步—————生产者与消费者实例

1、创建线程

Java中有两种方式创建线程,一种是继承Thread类。一种是实现Runnable接口。

建议使用实现Runnable接口的方式创建线程。

2、加入同步

要想达到线程同步,则需在方法前加入synchronized关键字。这样,有synchronized关键字修饰的方法就形成了同步方法。

3、加入等待与唤醒

当一个线程正在进行,则其他进程必须等待。当一个线程操作结束,唤醒等待的线程。



范例:

生产者与消费者模型

生产者与消费者模型中,生产者只有生产出产品,消费者才可以进行消费,此时需要有两个进程,分别表示消费者和生产者。为了是这两个线程正常运行而不出现死锁的现象,就要加入同步机制。


package com.zgy.thread2;
/*
 * 定义一个表示电脑的类Computer
 */
public class Computer 
{
    private String size; //定义变量size,用于表示电脑的型号
    private float price; //定义变量price,用于表示电脑的型号
Boolean flag = true;
    //分别产生size,price变量对应的setter、getter方法
    public String getSize() 
{
return size;
}
public void setSize(String size) 
{
this.size = size;
}
public float getPrice() 
{
return price;
}
public void setPrice(float price) 
{
this.price = price;
}
//定义Computer类的produce方法,表示生产电脑
public synchronized void produce(String size,float price) //设置型号和价格
{
if(!flag) //如果为flag为false,不可生产
{
try
{
super.wait(); //等待消费者取走
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
else
{
this.setSize(size);
try
{
Thread.sleep(500); //加入延迟
}
catch(InterruptedException e)
{
e.printStackTrace();
}
this.setPrice(price);
flag = false; //修改标识,flag=false
super.notify(); //唤醒等待的线程
System.out.println("生产电脑型号"+this.size+"——>"+"电脑价格"+this.price);
}

}
//定义Computer类的consum方法,表示消费电脑
public synchronized void consum()
{
if(flag) //如果flag为true,不可消费
try
{
super.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
else
{
try
{
Thread.sleep(500); //加入延迟
}
catch(InterruptedException e)
{
e.printStackTrace();
}
flag = true;
super.notify();
System.out.println("消费电脑型号"+this.size+"——>"+"电脑价格"+this.price); 


}

}
}




package com.zgy.thread2;


/**
 * 生产类Producer,表示生产电脑
 *
 */
public class Producer implements Runnable //定义生产者线程
{
    private Computer computer = null; //调用computer引用
public Producer(Computer computer) //通过构造方法设置computer的内容
    {
    this.computer = computer; //为computer属性初始化
    }

public void run() //实现Runnable接口中的抽象方法
    {
   
    for(int i = 0 ; i < 2 ; i++) //循环2次
    {
        this.computer.produce("联想", 4000f);
       
        }
 
    }
}



package com.zgy.thread2;


public class Consumer implements Runnable //定义生产者线程
{
    private Computer computer = null; //调用computer引用
    public Consumer(Computer computer) //通过构造方法设置computer的内容
    {
    this.computer = computer;
    }
public void run() //实现Runnable中的抽象方法
    {
    for(int i = 0 ; i < 2 ; i++)
    {
    try
    {
    Thread.sleep(500);
    }
    catch(InterruptedException e)
    {
    e.printStackTrace();
    }
    this.computer.consum();
    }
    }
}




package com.zgy.thread2;


public class Test 
{


public static void main(String[] args) 
{
        Computer computer = new Computer(); //创建Computer类的实例
        Producer producer = new Producer(computer); //创建Producer类的实例
        Consumer consumer = new Consumer(computer); //创建Consumer类的实例
        new Thread(producer).start(); //创建生产者线程并启动
        new Thread(consumer).start(); //创建消费者线程并启动
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值