您的位置:首页 > 编程语言 > Java开发

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

2014-10-25 19:30 288 查看
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(); //创建消费者线程并启动

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: