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

2016-08-19-java-关于线程的死锁的案例分析:生产者消费者问题

2016-08-19 21:58 676 查看
同步问题Java解决方案:

同步方法:当线程进入同步方法的时候,会获得同步方法所属的锁,一旦获得对象锁,则其他线程不能再执行被锁对象的其他任何同步方法。

只有在同步方法执行完毕之后释放锁,其他线程才能执行。

同步块:....

版本一(本人自己版):

package com.shi.onclass;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
* 关于生产者消费者线程的问题
* 两个对象:做面包的||吃面包的
* 两个方法:吃面包的方法||做面包的方法
* @author Shi
* 1.定一个数组对象存放我的面包
* 2.定一个面包个数的最大值
*
*/
public class Shop {
List<String> data = new ArrayList<String>();
public void produce(){
synchronized (data) {
if(data.size()>0){
System.out.println("可以卖面包了");
data.notify();
try {
data.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String a = "面包"+System.currentTimeMillis();
data.add(a);
System.out.println("生成了:"+a+",找人来吃,现在面包个数为:"+data.size());
//data.notify();
}

}

public void sale(){
synchronized (data) {
if(data.size()==0){
try {
System.out.println("没面包了该通知做面包了");
data.notify();
data.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String s = data.get(0);
data.remove(0);
System.out.println("吃掉了面包"+s);
data.notify();
}

}

public static void main(String[] args) {
Shop shop = new Shop();
Thread productor = new Thread(new Productor(shop));
Thread customer = new Thread(new Customer(shop));
productor.start();
customer.start();

}
}
class Productor implements Runnable{
Shop shop;

public Productor(Shop shop) {
super();
this.shop = shop;
}

@Override
public void run() {
while(true){
shop.produce();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// TODO Auto-generated method stub

}
}
class Customer implements Runnable{
Shop shop;

public Customer(Shop shop) {
super();
this.shop = shop;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
shop.sale();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}


版本二(改进老师版本,还是自己写的版本。。。。)

package com.shi.onclass;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
* 关于生产者消费者线程的问题
* 两个对象:做面包的||吃面包的
* 两个方法:吃面包的方法||做面包的方法
* @author Shi
* 1.定一个数组对象存放我的面包
* 2.定一个面包个数的最大值
*
*/
public class Shop {
List<String> data = new ArrayList<String>();
static final int MAX = 10;

public Shop() {
for(int i =0 ;i<5;i++){
data.add("面包"+System.currentTimeMillis());
}
}
public void product(){
synchronized (data) {
if(data.size()==MAX){
System.out.println("面包已满!等人吃了在做");
data.notify();//通知吃面包的人来吃面包
try {
data.wait();//等吃人吃了,收到做面包的通知再做面包
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
String s = "面包"+System.currentTimeMillis();
data.add(s);
System.out.println("生成了:"+s+",找人来吃,现在面包个数为:"+data.size());
data.notify();
}

}
public void eat(){
synchronized (data) {
if(data.size()==0){
System.out.println("面包没了,通知人来做");
data.notify();//通知发出
try {
data.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
String s = data.get(0);
data.remove(s);
System.out.println("消费了"+s+",并通知生成,还剩面包个数为:"+data.size());
data.notify();
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
Shop shop= new Shop();
Thread productor = new Thread(new Productor(shop));
Thread custmor = new Thread(new Customer(shop));
productor.start();
custmor.start();
}
}

//生产者线程
class Productor implements Runnable{
Shop shop;
Random r = new Random();
public Productor(Shop shop) {
super();
this.shop = shop;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
shop.product();
try {
Thread.sleep(100+r.nextInt(200));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Customer implements Runnable{
Shop shop;
Random r = new Random();
public Customer(Shop shop) {
super();
this.shop = shop;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
shop.eat();
try {
Thread.sleep(100+r.nextInt(200));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: