Java并发编程高级内容介绍(3)



submit和execute有什么区别呢?从入参和结果类型就知道了。

信号量:Semaphore

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么显然同时只能有5个人占用厕所,当5个人中的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的fair参数选项。

Semaphore可以控制某个资源可被同时访问的个数(构造方法传入),通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

代码示例:

public static void main(String[] args) {
 
    final Semaphore semaphore = new Semaphore(5);
 
    for(int i = 0 ; i < 6 ; i++){
 
        new Thread(new Runnable() {
            @Override
            public void run() {
 
                try {
                    semaphore.acquire();
 
                    System.out.println(Thread.currentThread().getName() + " 运行...");
 
                    Thread.sleep(1000);
 
                    semaphore.release();
 
                    System.out.println(Thread.currentThread().getName() + " 结束...");
 
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
            }
        },String.valueOf(i)).start();
 
 
    }
 
}

Condition

JDK由原始的synchronized发展到Lock,以类的方式提供锁机制,发展出重入锁、读写锁,以类的形式存在自然功能更加强大灵活,比如可以tryLock进行锁的嗅探。在synchronized代码块中我们可以使用wait/notify/notifyAll来进行线程的协同工作,那么JDK也发展了这一块,即Condition。Condition.await类似于wait,Condition.signal/signalAll类似于notify/nofityAll。下面我们简单实现一个Condition版的生产者/消费者。

处理核心:Handler

public class Handler {
 
    //容器
    private LinkedList<String> linkedList = new LinkedList<String>();
 
    //限制
    private int MAX_SIZE = 3;
 
    //锁
    private Lock lock = new ReentrantLock();
 
    //condition  实际上,可以new多个condition,这里暂且只是用给一个
    private Condition condition = lock.newCondition();
 
    public void put(String bread){
 
        try{
            lock.lock();
 
            if(linkedList.size() == MAX_SIZE){
                System.out.println("容器已满");
                condition.await();
            }
 
            linkedList.add(bread);
            System.out.println("放入面包" + bread);
            condition.signalAll();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
 
    }
 
    public void eat(){
 
        try{
            lock.lock();
 
            if(linkedList.size() == 0){
                System.out.println("容器为空");
                condition.await();
            }
 
            String bread = linkedList.removeFirst();
            System.out.println("吃掉一个面包" + bread);
            condition.signalAll();
 
        }catch(Exception e){
 
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
 
 
    }
 
}

生产者:Produce

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

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