Java多线程中线程间的通信(3)

Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                if (list2.size() != 5) {
                    try {
                        countDownLatch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");
                throw new RuntimeException();
            }
        }, "t2");

t2.start();
        t1.start();

}
}

程序输出:

当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
Exception in thread "t2" 当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
java.lang.RuntimeException
    at com.ietree.multithread.sync.ListAdd2$2.run(ListAdd2.java:56)
    at java.lang.Thread.run(Unknown Source)
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..

四、使用多线程模拟一个队列

package com.ietree.multithread.sync;

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

public class MyQueue {

// 1、定义一个盛装元素集合
    private LinkedList<Object> list = new LinkedList<Object>();

// 2、定义一个计数器
    private AtomicInteger count = new AtomicInteger();

// 3、指定上限和下限
    private final int minSize = 0;
    private final int maxSize;

// 4、构造方法初始化大小
    public MyQueue(int size) {
        this.maxSize = size;
    }

// 5、初始化一个对象用于加锁
    private Object lock = new Object();

// put(anObject): 把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断,直到BlockingQueue里面有空间再继续.
    public void put(Object obj) {
        synchronized (lock) {
            if (count.get() == this.maxSize) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 1、加入元素
            list.add(obj);
            // 2、计数器累加
            count.incrementAndGet();
            // 3、通知(唤醒)另外一个线程
            lock.notify();
            System.out.println("新加入的元素为:" + obj);
        }
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e47e1e45b8771c18c0989920ba2fb5a8.html