java 生产消费者模型

生产消费者模型

1.通过这个模型 成功的演示出了 线程安全的问题

  两个消费者 同时访问同一个仓库对象 仓库内只有一个元素的时候

  两个消费者并发访问 会有可能产生抢夺资源的问题

2.自己解决一下线程安全的问题

  让仓库对象被线程访问的时候 仓库对象被锁定

  仓库对象只能被一个线程访问 其它的线程处于等待状态

  特征修饰符

  synchronized  同步  一个时间点只有一个线程访问

  线程安全锁(2种形式写法)

  1.将synchronized关键字 放在方法的结构上

  public synchronized void get(){}

  锁定的是调用方法时的那个对象

  2.将synchronized关键字 放在方法(构造方法 块)的内部

  public void get(){

    好多代码

    synchronized(对象){

      好多代码

      }

    好多代码

    }

3.我们觉得return不是很好

  应该让线程的不同状态来回切换

  执行 等待  执行 等待

  wait()  Object类中的方法;//对象.wait(); 不是当前的这个对象wait,访问当前这个对象的线程wait;

wait()产生一个类似假死状态 所有的线程都进入等待状态 没有线程做事

  notify ()  notifyAll()  Object类中的方法

  Thread.sleep();

  run();

  start();

多线程并发,可能出现抢资源;

 

 不加线程安全锁,可能出现如下错误;

 

 4.通过上述的生产消费者模型

  做了一个非常完整而且安全的模型

  1.利用线程安全锁 特征修饰符synchronized

    两种不同的写法

    不管怎么写 锁定的永远是对象

  2.利用方法控制线程状态的来回切换

    wait()

    notify()  notifyAll()

    上述三个方法都是Object类中的方法

  3.Thread类中的方法

    sleep方法  静态方法(参数long 毫秒值)

    setPriority(10);   getPriority();

  //设置线程的优先级 1-10  谁越高优先级越高 更加容易获取CPU分配的资源碎片

  4.笔试题

    程序 进程  线程  概念的区别

    线程的创建方法

    线程的几种状态  如何切换

        sleep方法  wait方法的区别

    1.类   Thread类  Object类

    2.调用  静态  类名.    对象.

    3.理解  (sleep)哪个位置调用 哪个线程等待;

         (wait)哪个线程等待  访问对象的其他线程等待;

    4.唤醒  不需要别人唤醒  需要其他对象调用notify()或notifyAll()唤醒

    5.锁    不会释放锁  等待后会释放锁

  5.join方法  Thread类中的方法

    让多个线程同步执行   变成单个线程

  6.死锁;

package test0604;
import java.util.ArrayList;
public class WareHouse{		
	private ArrayList<String> aa=new ArrayList<>();
	public synchronized void add(){
		if(aa.size()<20){
			aa.add("a");
		}else{
			//return;//方法执行到这里就结束方法
			try{
				this.notifyAll();
				this.wait();//仓库调用wait 不是仓库对象等待 访问仓库的生产者进入等待状态
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}

	public synchronized void get(){
	//public void get(){
		if(aa.size()>0){
			aa.remove(0);
		}else{
			//return;
			try{
				this.notifyAll();
				this.wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}
package test0604;

public class Producer extends Thread{
	private WareHouse house;//属性
	public Producer(WareHouse house){
		this.house=house;
	}
	public void run(){
		while(true){
			house.add();
			System.out.println("生产者存入了一件货物");
			try{
				Thread.sleep(200);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

 

package test0604;

public class Consumer extends Thread{
	private WareHouse house;
	public Consumer(WareHouse house){
		this.house=house;
	}
	public void run(){
		while(true){
			house.get();
			System.out.println("消费者取出来一件货物");
			try{
				Thread.sleep(300);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			
		}
	}
	
}

 

package test0604;
public class TestMain{
	public static void main(String[] args){
		WareHouse house=new WareHouse();
		Producer p=new Producer(house);
		//设置线程的优先级别1-10
		p.setPriority(10);
		Consumer c=new Consumer(house);
		Consumer d=new Consumer(house);
		p.start();
		c.start();
		d.start();
	}
}

  

 

 

  

 

posted on 2020-06-04 22:43  星空6  阅读(175)  评论(0编辑  收藏  举报

导航