美文网首页
多线程中的wait与notify和synchronized结合用

多线程中的wait与notify和synchronized结合用

作者: 跨界师 | 来源:发表于2018-01-18 22:12 被阅读184次

wait和notify方法需要和synchronized结合起来使用才能得到发挥他们的效果。

例如:我们实现一个阻塞式的队列功能;
思路:

  • 首先我们需要定义个队列,本例使用Linkedlist,
  • 其次需要定义队列的上下限,这样就固定好了队列的长度,因为我们要实现阻塞功能。
  • 最后就是实现队列的基本的元素插入和元素删除功能,其他功能可以自行添加,这里就不多说了。
package Thread;

import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by zhangzheming on 2018/1/18.
 */

public class MyQueue {

    // 集合
    private final LinkedList<Object> list = new LinkedList<>();
    // 计数器
    private AtomicInteger count = new AtomicInteger(0);
    // 上限和下限
    private final int minSize = 0;

    private final int maxSize;
    // 构造函数
    public MyQueue(int size){
        this.maxSize = size;
    }

    private final Object lock = new Object();

    public void put(Object obj){
        synchronized (lock){
            while (count.get() == this.maxSize){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 加入元素
            list.offer(obj);
            System.out.println("新加入元素:"+obj);
            // 计数器计数
            count.incrementAndGet();
            // 唤醒线程
            lock.notify();
        }
    }

    public Object take(){
        Object ret = null;
        synchronized (lock){
            while (count.get() == this.minSize){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 移除队列的元素
            ret = list.remove();
            //  计数器减1
            count.decrementAndGet();
            // 唤醒线程
            lock.notify();
        }

        return ret;
    }


    public int getSize(){
        return this.list.size();
    }

    public static void main(String[] args){
        MyQueue mq = new MyQueue(7);
        mq.put("a");
        mq.put("b");
        mq.put("s");
        mq.put("r");
        mq.put("t");
        mq.put("tewf");
        mq.put("twefw");


        System.out.println("当前容器的长度:"+mq.getSize());

        Thread t1 = new Thread(new Runnable(){
            @Override
            public void run() {
                mq.put("'as");
                mq.put("sf");
            }
        },"t1");


        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Object o1 = mq.take();
                System.out.println("移除的元素为:"+o1);

                Object o2 = mq.take();
                System.out.println("移除的元素:"+o2);
            }
        },"t2");

        t1.start();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.start();
    }
}

上述代码实现了简单的队列形式,但是这个不够严谨,需要完善,但是这个demo初步实现队列的插入和删除功能。


执行结果.png

相关文章

网友评论

      本文标题:多线程中的wait与notify和synchronized结合用

      本文链接:https://www.haomeiwen.com/subject/vxfjoxtx.html