• 线程池


    线程池
    解决了多生产多消费的效率问题
    使用了JDK1.5 java.util.concurrent.locks包中的对象。
    Lock接口:它的出现比synchronized有更多的操作。
    lock():获取锁。
    unlock():释放锁。

    同步代码块或者同步函数的锁操作是隐式的。
    JDK1.5 Lock接口,按照面向对象的思想,将锁单独封装成了一个对象。
    并提供了对锁的显示操作。

    Lock接口就是同步的替代。
    将线程中的同步更换为Lock接口的形式。

    替换完运行失败了。因为wait没有了同步区域,没有了所属的同步锁。
    同步升级了。其中锁已经不是在任意对象,而是Lock类型的对象。
    那么和任意对象绑定的监视器方法,是不是也升级了,有了专门和Lock类型锁的绑定的监视器方法呢?
    查阅api。Condition接口替代了Object中的监视器方法。

    以前监视器方法封装到每一个对象中。
    现在将监视器方法封装到了Condition对象中。
    方法名为:await signal signalAll


    监视器对象Condition如何和Lock绑定呢?

    ---可以通过Lock接口的newCondition()方法完成。

    但是,问题依据,一样唤醒了本方。效率仍旧低!

    //描述资源。
    class Res
    {
    private String name;
    private int count = 1;
    //创建新Lock。
    private Lock lock = new ReentrantLock();
    
    //创建和Lock绑定的监视器对象。创建两个。
    //生产者监视器。
    private Condition producer_con = lock.newCondition();
    //消费者监视器
    private Condition consumer_con = lock.newCondition();
    
    //定义标记。
    private boolean flag;
    //提供了给商品赋值的方法。
    public void set(String name)//
    {
    //获取锁。
    lock.lock();
    
    try{
    while(flag)//判断标记为true,执行wait。等待。为false。就生产。
    try{producer_con.await();}catch(InterruptedException e){}//t0(等) t1(等)
    this.name = name + "--" + count;//面包1 ,面包2 面包3
    
    count++;//2 3 4
    System.out.println(Thread.currentThread().getName()+"...生产者....."+this.name);//t0 面包1、 t0 面包2 t1 ,面包3
    //生成完毕,将标记改为true。
    flag = true;
    //生产完毕,应该唤醒一个消费者来消费。
    consumer_con.signal();
    
    }finally{
    
    //释放锁。
    lock.unlock();
    }
    }
    
    //提供一个获取商品的方法。
    public void get()//
    {
    lock.lock();
    try{
    while(!flag)
    try{consumer_con.await();}catch(InterruptedException e){}//t2(等) t3(等)
    System.out.println(Thread.currentThread().getName()+".......消费者....."+this.name);//t2 面包1.
    
    //将标记改为false。
    flag = false;
    //消费完后,应该唤醒生产者一个。
    producer_con.signal();
    }finally{
    lock.unlock();
    }
    }
    }
    
    
    //生成者。
    class Producer implements Runnable
    {
    private Res r;
    Producer(Res r)
    {
    this.r = r;
    }
    public void run()
    {
    while(true)
    r.set("面包");
    }
    }
    
    //消费者
    class Consumer implements Runnable
    {
    private Res r;
    Consumer(Res r)
    {
    this.r = r;
    }
    public void run()
    {    
    while(true)
    r.get();
    }
    }
    
     
    
    
    class NewProducerConsumerDemo
    {
    public static void main(String[] args) 
    {
    //1,创建资源。
    Res r = new Res();
    //2,创建两个任务。
    Producer pro = new Producer(r);
    Consumer con = new Consumer(r);
    
    //3,创建线程。
    Thread t0 = new Thread(pro);
    Thread t1 = new Thread(pro);
    Thread t2 = new Thread(con);
    Thread t3 = new Thread(con);
    
    t0.start();
    t1.start();
    t2.start();
    t3.start();
    }
    }
    天行健,君子以自强不息
  • 相关阅读:
    [转载]辗转相除法
    [转载]自由不是什么
    [翻译]与比尔·盖茨面对面
    [翻译]AJAX XMLHttpRequest对象 详解
    [转载]Win32应用程序中进程间通信方法分析与比较
    C# 中的类型转换
    Log4Net
    抽象类和接口
    有用的自定义pagecounter控件
    单点登陆单web应用的单点登陆
  • 原文地址:https://www.cnblogs.com/god-y-l/p/6778617.html
Copyright © 2020-2023  润新知