其他分享
首页 > 其他分享> > 等待唤醒案例和线程间通信

等待唤醒案例和线程间通信

作者:互联网

等待唤醒案例:线程之间的通信:

    创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WALITTNG状态(无限等待)

    创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子。

注意:

  顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行

  同步使用的锁对象必须保证唯—

  只有锁对象才能调用wait和notify方法

 

Object类中的方法:void wait()在其他线程调用此对象的notify()方法或notifyALl()方法前,导致当前线程等待。

void notify:唤醒在此对象监视器上等待的单个线程。会继续执行wait方法之后的代码

 

举例:

public static void main(String[] args) {

        final Object o = new Object();
        new Thread(){
            @Override
            public void run() {
                while (true){
                    synchronized (o){
                        System.out.println("数量");
                        try {
                            o.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o){
                        System.out.println("可以吃包子");
                        o.notify();
                    }
                }
            }
        }.start();
 
    }

 

 

线程间通信:

概念:多个线程在处理同意一个资源,但是处理的动作线程的任务却不同

比如∶线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。

为什么要处理线程间通信:

多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们

希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源:

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。

就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能

有效的利用资源。而这种手段即――等待唤醒机制。

图:

 

 

搜索

 

 

 

 

 

 

复制

标签:void,间通信,线程,notify,唤醒,包子,wait
来源: https://www.cnblogs.com/12-12-12/p/16461408.html