zoukankan      html  css  js  c++  java
  • java10 -02 notify()

    notify() :通知 只能唤醒一个 随机的

    通知是锁对象的方法

    调通知的话 就把等待队列中某一个线程唤醒,把它唤醒后,它可以在去抢CPU。

    对于生产者,一旦当了元素,即消费者就可以取走了。

    sleep():放弃CPU的抢占权,跟锁对象的监控权无关

    wait():相当于线程停止,要想再次运行,就要用notify() 通知模式。

    让当前线程进入到锁对象的等待队列中去,同时释放锁旗标。

    -------------------------------------------源码

    class TenProductCustor4{
    public static void main(String[] agrs) {
    MyList mylist =new MyList();
    Productor p =new Productor(mylist);
    Productor p1 =new Productor(mylist);
    Cusumer c =new Cusumer(mylist);
    p.start();
    p1.start();
    c.start();

    }

    }

    //用类封装集合,同步要么往里放,要么取。
    class MyList{
    private int MAX =100;
    private java.util.List<Integer> list =new java.util.LinkedList<Integer>();
    //同步方法,满了即等待。wait方法是object定义的,sleep是线程类的方法。要用Thread.sleep() 锁里面是有等待机制的,任何对象都可以是锁。同步方法以当前对象MyList作为锁。
    public synchronized void addLast(Integer i){
    //如果大于这个数就等待
    while(list.size()>=MAX){
    try{
    wait();
    }

    catch(Exception e){

    }
    }
    list.add(i);
    //添加完一个元素,通知一下。通知等待的队列。通知方法不会释放锁旗标
    System.out.println("库存=》" +list.size());
    notify();
    }

    public synchronized Integer removeFirst(){
    while(list.size()==0){
    try{
    wait();
    }

    catch(Exception e){

    }
    }
    notify();
    int no = list.remove(0);
    System.out.println("remove=》" +list.size());
    return no;
    }
    }

    //生产者

    class Productor extends Thread{
    static int i=1;
    //创建一个集合
    private MyList mylist;
    public Productor(MyList mylist){
    this.mylist=mylist;
    }

    public void run(){

    while(true){
    mylist.addLast(i);
    System.out.println("生产了=====》》" +i);
    i++;
    }
    }
    }
    //消费者
    class Cusumer extends Thread{
    private MyList mylist;
    public Cusumer(MyList mylist){
    this.mylist=mylist;
    }

    public void run(){
    while(true){
    int no =mylist.removeFirst();
    System.out.println("消费了=====》》" +no);
    }
    }
    }

    ------------------------------------------------------------------

    同步代码

    class TenProductCustorwait5{
    public static void main(String[] agrs) {
    Pool pool = new Pool();
    Producer p = new Producer("p"+pool);
    Consumer c = new Consumer("c"+pool);
    p.start();
    c.start();

    }

    }
    class Pool{
    private int Max =100;
    private java.util.List<Integer> list =new java.util.LinkedList<Integer>();

    public void addLast(int i){
    //以当前对象Pool做锁,把当前线程放到锁的队列中去
    synchronized(this){
    while(list.size()>= Max){
    try{
    wait();
    }

    catch(Exception e){

    }
    }
    list.add(new Integer(i));
    this.notify();//通知和等待都是掉锁的方法
    }
    }

    public int Remove(){
    //以当前对象Pool做锁,把当前线程放到锁的队列中去
    synchronized(this){
    while(list.size()==0){
    try{
    wait();
    }

    catch(Exception e){

    }
    }
    int no =list.remove(0);
    this.notify();
    return no;
    }
    }

    }

    class Producer extends Thread{
    private Pool pool;

    private String name;
    static int i =1;
    public Producer( String name,Pool pool){
    this.pool =pool;

    this.name=name;
    }
    public void run(){
    while(true){
    pool.addLast(i++);
    System.out.println("生产者"+i);
    }
    }
    }

    class Consumer extends Thread{

    private String name;
    private Pool pool;
    public Consumer(String name,Pool pool){
    this.pool =pool;

    this.name=name;
    }
    public void run(){
    while(true){
    int no = pool.Remove();
    System.out.println("消费了"+no);
    }
    }
    }

  • 相关阅读:
    CPU高问题排查
    java lambda特性(持续学习+更新)
    零星小记
    redis分布式锁和lua脚本
    webservice之拦截器
    扫一扫
    qq登录
    banner的使用
    surfaceview+mediaplayer
    viewpager加fragment可滑动加radio跟随滑动
  • 原文地址:https://www.cnblogs.com/simly/p/10553139.html
Copyright © 2011-2022 走看看