线程池的一点知识(附示例代码)
来源:互联网 发布:钱宝数据助手怎么退订 编辑:程序博客网 时间:2024/04/29 10:09
线程池:
解决了多生产多消费的效率问题
使用了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 面包3count++;//2 3 4System.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();}}
0 0
- 线程池的一点知识(附示例代码)
- 线程池、函数指针、 pthread_cond_signal和pthread_cond_wait融合示例详解(附代码)
- 线程的一点小知识
- 线程池示例代码
- 线程池示例代码
- Java中的线程的一点知识
- Apple Pay教程(附示例代码)
- Linux C++ 一个线程池的简单实现(附代码)
- 线程示例,一段没一点意义的代码,自已也不知道拿来做什么,跟着书上抄的
- android 使用asynctask结合fragment更新UI(另附线程池管理示例)
- 关于进程和线程的一点小知识~
- 最常用的1000个Java类 (附代码示例)
- iOS_assign,retain,weak,strong的引用计数区别(附代码示例)
- 最常用的1000个Java类 (附代码示例)
- 最常用的1000个Java类(附代码示例)
- 最常用的1000个Java类(附代码示例)
- 最常用的1000个Java类(附代码示例)
- 最常用的1000个Java类(附代码示例)
- 344. Reverse String(C语言)
- 解决Mysql错误Too many connections的方法
- AngularJS控制器
- Mybatis 配置出现元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectF
- ubuntu mysql 启动失败
- 线程池的一点知识(附示例代码)
- eclipse加载Java连接MySQL驱动
- gnuplot 常用命令大全
- Android动画(一),逐帧动画
- hough变换理解
- CSS3主要知识点复习总结+HTML5新增标签
- springboo加载resources下的任意文件
- 最新化学元素周期表
- SQL Server中行列转换