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(); //创建消费者线程并启动
}
}
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(); //创建消费者线程并启动
}
}
相关文章推荐
- java 线程同步问题之生产者消费者问题
- 经典线程同步问题(生产者&消费者)--Java实现
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- java生产者消费者问题(线程同步与线程等待的应用)
- 【线程同步2】java实现生产者消费者问题$扩展,出现的问题,思考
- JAVA多线程模拟生产者与消费者_实例
- java生产者消费者实例代码
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- 【设计模式】java生产者和消费者的代码实例
- java生产者消费者问题(线程同步与线程等待的应用)
- java生产者消费者问题(线程同步与线程等待的应用)
- 第九章 Java多线程机制 05_线程同步_7_生产者消费者问题
- Java 线程同步wait()用法 生产者 消费者问题
- java中多线程通信实例:生产者消费者模式
- JAVA多线程实例(生产者与消费者问题)
- java实现的生产者和消费者问题-涉及线程同步与通信
- Java经典线程同步问题------生产者与消费者
- Java经典线程同步问题------生产者与消费者
- java之多线程实例 生产者与消费者
- 【线程同步】java实现生产者消费者问题与线程中的wait与notify总结