申博在线娱乐登入

申博在线娱乐登入wait()与notify()

一,前言

本文来源:http://www.yu833.com/mil_eastday_com/

申博在线娱乐登入,  与南园隔着一条民族园路的北园景区仍在正常营业,门票60元。今天面对广东,胡金秋无疑更想赢,但没想到做足准备的他,最后却没有获得足够多的机会和支持。比如,发动机共轨系统技术主要被德国博世、美国德尔福掌控。”上述专家指出。

  于德陆在当地时间晚间时段进行比赛,对手是莱恩斯,一上来于德陆就打出单杆69分先下一城,第二局莱恩斯回敬单杆50分将比分扳成1-1平,第三局于德陆单杆62分制胜后又连胜三局以总比分5-1取得全场比赛胜利,轻松过关。服务声明欢迎您访问车讯网!使用车讯网网站内容、产品及服务的用户均应仔细阅读本声明,用户可选择不使用车讯网网站,用户使用车讯网网站的行为,包括查看信息以及使用车讯网网站预订服务将被视为对本声明全部内容的认可。”从10月30日西村跑步相亲活动之后,李女士常常给工作人员打电话、发微信,这次终于传来了好消息。  信心来自于三方面。

在烟雨迷离中,圣湖羊卓雍错半掩半现,待我们盘旋下山,云消雾也散,圣湖以潋滟的波光洗礼着我们的视线。美国玉米带还有一点,中国养的猪1年一般产仔16头,而美国猪一年能产30头,这主要是因为美国市场上的生猪品种都是改良的精选品种,尽管培育一只优良基因的种猪需要长达5年、30来万的成本,但该类种猪一旦培育成功,将大大带动商品猪的生产效率。”  (解读人:人力资源和社会保障部就业促进司有关负责人 采访人:本报记者白天亮)  “住房公积金走市场化道路,实际上也是对此类资金保值增值的一个考虑,最终都将惠及公积金资源使用者的权益,类似买房、租房等方面的资金需求。

?

? 简单画了一下线程的流程图,只是一个大概。如图所示,线程有多种状态,那么不同状态之间是如何切换的,下面主要总结关于wait()和notify()的使用。

二,wait()

? wait()和notify()都是定义在Object类中,为什么如此设计。因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify(),并且只有同一把锁才能对线程进行操作,不同锁之间是不可以相互操作的,所以wait和notify属于Object。请看如下API文档说明。

? wait()提供三种构造方法,但前两种最为常用,wait()是让线程一直处于等待状态,直到手动唤醒,而wait(long timeout)可以指定等待时间,之后会自动唤醒。

?

? 调用wait方法可以让当前线程进入等待唤醒状态,该线程会处于等待唤醒状态直到另一个线程调用了object对象的notify方法或者notifyAll方法。

三,notify()

?

? notify()唤醒等待的线程,如果监视器种只有一个等待线程,使用notify()可以唤醒。但是如果有多条线程notify()是随机唤醒其中一条线程,与之对应的就是notifyAll()就是唤醒所有等待的线程,请看下面实例代码。

? 案例:定义两条线程,分别让其线程等待,及线程唤醒。

? 1,定义线程。

public class SetTarget implements Runnable{
    private Demo demo;
    public SetTarget(Demo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.set();
    }
}
public class GetTarget implements Runnable {
    private Demo demo;
    public GetTarget(Demo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.get();
    }
}

? 2,编写main方法。

public class Demo {

    /定义一个信号量
    private volatile int signal;

    public static void main(String[] args) {
        
        Demo demo = new Demo();
        SetTarget set = new SetTarget(demo);
        GetTarget get = new GetTarget(demo);
        
        /开启线程,
        new Thread(get).start();
        new Thread(get).start();
        new Thread(get).start();
        new Thread(get).start();
        
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        new Thread(set).start();
    }

    /set方法唤醒线程
    public synchronized void set() {
        signal = 1;
        /notify方法会随机叫醒一个处于wait状态的线程
        notify(); 
        /notifyAll叫醒所有的处于wait线程,争夺到时间片的线程只有一个
        /notifyAll();
        System.out.println("叫醒线程叫醒之后休眠开始...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /get方法使线程进入等待状态
    public synchronized int get() {
        System.out.println(Thread.currentThread().getName() + " 方法执行了...");
        if (signal != 1) {
            try {
                wait();
                System.out.println("叫醒之后");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + " 方法执行完毕...");
        return signal;
    }
}

? 3,运行结果。

?

? 分析:一共开启了4个线程,当全部进入等待状态时,调用notify()方法唤醒线程,但很明显只唤醒了其中一条线程。右上角显示程序并没有停止,原因就是其他3条线程仍在处于等待状态。

? 使用notifyAll()唤醒线程:

?

四,生产者-消费者模式

? 生产者-消费者模式,生产者生产商品,然后通知消费者进行消费。

? 1,定义生产者

public class Vendor {
    /定义库存数量
    private int count;

    /定义最大库存
    private final int MAX_COUNT = 10;

    public synchronized void production() {
        while (count >= MAX_COUNT) {
            try {
                System.out.println(Thread.currentThread().getName() + "库存数量达到最大值,停止生产。");
                /此时生产线程全部进入等待状态
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        /否则生产商品
        count++;
        System.out.println(Thread.currentThread().getName() + "正在生产商品,当前库存为:" + count);
        notifyAll();

    }

    public synchronized void consumers() {
        while (count <= 0) {
            try {
                System.out.println(Thread.currentThread().getName() + "没有商品了,消费者处于等待状态...");
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count--;
        System.out.println(Thread.currentThread().getName() + "正在消费,当前库存为:" + count);
        notifyAll();
    }
}

? 2,分别定义两条线程。

public class SetTarget implements Runnable {

    private Vendor vendor;

    public SetTarget(Vendor vendor) {
        this.vendor = vendor;
    }

    @Override
    public void run() {
        while(true){
            vendor.production();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                /TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}
public class GetTarget implements Runnable {

    private Vendor vendor;

    public GetTarget(Vendor vendor) {
        this.vendor = vendor;
    }

    @Override
    public void run() {
        while(true){
            vendor.consumers();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                /TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

? 3,主方法。

public class Demo {
    public static void main(String[] args) {
        Vendor vendor = new Vendor();
        SetTarget set = new SetTarget(vendor);
        GetTarget get = new GetTarget(vendor);
        
        /开启线程生产商品
        new Thread(set).start();
        new Thread(set).start();
        new Thread(set).start();
        new Thread(set).start();
        
        /开启消费者线程
        new Thread(get).start();
    }
}

? 4,运行结果。

五,总结

? 线程之间通信就做这么一个简单的总结,以上内容如有错误,欢迎留言指正。

感谢阅读!

?

posted @ 2019-09-28 15:19 申博在线娱乐登入奋进的小样 阅读(...) 评论(...) 申博在线娱乐登入 编辑 收藏
菲律宾申博太阳城 申博太阳城娱乐中心直营网 www.99msc.com 777老虎机微信支付充值 申博游戏端下载 申博官网直营网址
菲律宾申博官网怎么登入 申博开户现金网直营网 旧版太阳城申博现金直营网 申博开户直营网 老虎机支付宝充值 菲律宾申博现金网登入
申博网络游戏直营网 申博网上娱乐总公司 菲律宾申博开户合作 菲律宾申博娱乐现金网 申博游戏平台直营网 申博官网登录登入