zoukankan      html  css  js  c++  java
  • [javaSE] 多线程通信(等待-唤醒机制)

    两个线程操作同一个资源,比如,输入和输出,操作同一个对象,此时两个线程会争夺cpu的执行权,随机的进行切换。我们想实现先输入再输出,顺序的执行

    目标对象定义一个标记字段,进行判断,wait()notify()方法

    wait()方法,线程会处于等待状态,等待的线程位于内存中的线程池中

    notify()方法,唤醒线程池中的线程

    notifyAll()方法,唤醒全部线程

    上面的方法,需要写在同步里面,并且需要标识锁

    这些操作线程的方法定义在Object对象中,因为这些方法,要通过同一个锁对象来调用

    /**
     * 资源
     * 
     * @author taoshihan
     * 
     */
    class People {
        String name;
        String sex;
        Boolean myLock = false;
    }
    
    /**
     * 输入
     * 
     * @author taoshihan
     * 
     */
    class PeopleJoin implements Runnable {
        private People resource;
    
        public PeopleJoin(People resource) {
            this.resource = resource;
        }
    
        @Override
        public void run() {
            // 切换
            boolean flag = true;
            while (true) {
                synchronized (resource) {
                    if (resource.myLock) {
                        try {
                            resource.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    if (flag) {
                        resource.name = "taoshihan";
                        resource.sex = "nan";
                    } else {
                        resource.name = "陶士涵";
                        resource.sex = "男";
                    }
                    flag = !flag;
                    resource.myLock=true;
                    resource.notify();
                }
            }
        }
    
    }
    
    /**
     * 输出
     * 
     * @author taoshihan
     * 
     */
    class PeopleOut implements Runnable {
        private People resource;
    
        public PeopleOut(People resource) {
            this.resource = resource;
        }
    
        @Override
        public void run() {
            while (true) {
                synchronized (resource) {
                    if(!resource.myLock){
                        try {
                            resource.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(resource.name + "=====" + resource.sex);
                    resource.myLock=false;
                    resource.notify();
                }
            }
        }
    
    }
    
    public class ThreadDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            People resource = new People();
            PeopleJoin input = new PeopleJoin(resource);
            PeopleOut output = new PeopleOut(resource);
    
            Thread t1 = new Thread(input);
            Thread t2 = new Thread(output);
            t1.start();
            t2.start();
        }
    
    }

  • 相关阅读:
    HDU 5363 Key Set(快速幂取模)
    HDU 5339 Untitled(暴搜)
    POJ 2406 Power Strings
    Dedecms备份还原网站有效方法
    DEDECMS文章列表每隔8行文章添加分隔虚线
    DEDECMS突破TAG和关键字长度的限制
    为织梦dedecms制作全文RSS订阅源
    DedeCms中Channel用typeid无效
    织梦CMS/Dedecms添加自定义函数
    sql批量换dedecms文章来源和作者
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5565601.html
Copyright © 2011-2022 走看看