zoukankan      html  css  js  c++  java
  • notify,wait,synchronized实现线程间通知

    wait阻塞线程释放锁;notify使wait所在的线程被唤醒在次获得锁,并执行,但要等到notify所在的线程代码全部执行后!

    示例代码如下:

    package com.vhbi.service.impl;
    
    import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
    
    import java.util.LinkedList;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * Created by zzq on 2017/5/8.
     */
    public class TeamTest {
    
        private LinkedList _list = new LinkedList<Object>();
    
        private int size = 0;
    
        private AtomicInteger atomicInteger = new AtomicInteger();
    
        public TeamTest(int size) {
            this.size = size;
        }
    
        private final Object lock = new Object();
    
        public void take() throws Exception {
            synchronized (lock) {
                while (0 == atomicInteger.get()) {//计数器和最大值相等
                    lock.wait();//进入等待状态,释放锁
                }
                //被唤醒后
                //1.计数器减一
                atomicInteger.decrementAndGet();
                //2.队列去掉一个
                Object currObj = _list.removeFirst();
                System.out.println("------take------ " + currObj);
                //3.获得锁,唤醒wait执行线程的等待
                lock.notify();
            }
        }
    
        public void put(Object obj) throws Exception {
            synchronized (lock) {
                while (this.size == atomicInteger.get()) {//计数器和最大值相等
                    lock.wait();//进入等待状态,释放锁
                }
                //被唤醒后
                //1.计数器加一
                atomicInteger.incrementAndGet();
                //2.队列添加一个
                _list.add(obj);
                System.out.println("------put------ " + obj);
                //3.获得锁,唤醒wait执行线程的等待
                lock.notify();
            }
        }
    }

    测试结果代码:

     @org.junit.Test
        public void main2() throws Exception {
            final TeamTest teamTest = new TeamTest(5);
            teamTest.put(1);
            teamTest.put(2);
            teamTest.put(3);
            teamTest.put(4);
            teamTest.put(5);
    
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        teamTest.put(6);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            t1.start();
    
            Thread.sleep(5000);
            teamTest.take();
    
        }
    
        @org.junit.Test
        public void main3() throws Exception {
            final TeamTest teamTest = new TeamTest(5);
    
    
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        teamTest.take();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            t1.start();
    
            Thread.sleep(5000);
            teamTest.put(1);
            teamTest.put(2);
    
        }
  • 相关阅读:
    利用Clojure统计代码文件数量和代码行数
    Workflow:添加工作流存储功能
    MongoDB:最简单的增删改查(Oops,可能太简单了)
    《WF in 24 Hours》读书笔记
    推荐一个学习python的网站
    Inter系列处理器名称浅析
    [Android1.5]TextView跑马灯效果
    Code::Blocks 的配色方案
    PuTTY + Xming 远程使用 Linux GUI
    Linux下查看文件和文件夹大小
  • 原文地址:https://www.cnblogs.com/zzq-include/p/6827813.html
Copyright © 2011-2022 走看看