多线程(3)
2015-07-03 23:25
197 查看
多线程,多生产多消费:
Lock接口:它的出现比synchronized有更多的操作。
lock():获取锁。
unlock():释放锁。
同步代码块或者同步函数的锁操作是隐式的。
JDK 1.5 Lock接口, 按照面向对象的思想,将锁单独封装成了一个对象。
并提供了对锁的显示操作。
Lock接口就是同步的替代。
1,将线程中的同步更换为Lock接口的形式。
替换完运行失败了,因为wait没有了同步区域,没有了所属的同步锁。
同步升级了。其中锁已经不是在任意对象,而是Lock类型的对象。
那么和任意对象绑定的监视器方法,是不是也升级了,有了专门和Lock类型锁的绑定的监视方法呢?
查阅api。 Condition接口替代了Object中监视器方法。
以前监视器方法封装到每一个对象中。
现在将监视器方法封装到了Condition对象中。
方法名为: await signal signalAll
监视器对象Condition 如何和Lock绑定呢?
可以通过Lock接口的new Condition()方法完成。
但是,问题依旧,一样唤醒了本方。效率仍旧低。
解决:使用两个Condition对象分别对生产者消费者等待唤醒即可
wait()和sleep()的区别
相同:可以让线程处于冻结状态。
不同点:
1,wait()可以指定时间,也可以不指定。
sleep() 必须指定时间
2,wait(), 释放cpu资源,释放锁
sleep(): 释放cpu资源,不释放锁
异常会提示发生在哪个线程上,
异常会结束线程任务,也就是可以结束所在线程。
***如何停止线程?
原理:让run方法结束。
线程任务通常都有循环。因此开启线程就是为了执行需要一些时间的代码。
只要控制住循环,就可以结束run方法,就可以停止线程。
控制循环弄个标识即可,定义变量。
t1.interrupt() //将t1中断了,从冻结状态强制唤醒,又判断循环。
**守护线程:即后台线程。
t2.setDaemon(true);//将t2标识为后台线程
前台都结束,后台也结束
**
t1.join();//等待该线程终止。
让出执行权让t1执行,直到t1终止。
***优先级
Thread.currenThread().toString() // 返回该线程的字符串表现形式,包括线程名称,优先级和线程组
设置优先级 setPriority(); 获取getPriority()
t1.setPriority(Thread.MAX_PRIORITY);//设置优先级数为10
yield() // 暂停当前正在执行的线程对象,并执行其他线程。
多线程,多生产多消费:
Lock接口:它的出现比synchronized有更多的操作。
lock():获取锁。
unlock():释放锁。
同步代码块或者同步函数的锁操作是隐式的。
JDK 1.5 Lock接口, 按照面向对象的思想,将锁单独封装成了一个对象。
并提供了对锁的显示操作。
Lock接口就是同步的替代。
1,将线程中的同步更换为Lock接口的形式。
替换完运行失败了,因为wait没有了同步区域,没有了所属的同步锁。
同步升级了。其中锁已经不是在任意对象,而是Lock类型的对象。
那么和任意对象绑定的监视器方法,是不是也升级了,有了专门和Lock类型锁的绑定的监视方法呢?
查阅api。 Condition接口替代了Object中监视器方法。
以前监视器方法封装到每一个对象中。
现在将监视器方法封装到了Condition对象中。
方法名为: await signal signalAll
监视器对象Condition 如何和Lock绑定呢?
可以通过Lock接口的new Condition()方法完成。
但是,问题依旧,一样唤醒了本方。效率仍旧低。
解决:使用两个Condition对象分别对生产者消费者等待唤醒即可
wait()和sleep()的区别
相同:可以让线程处于冻结状态。
不同点:
1,wait()可以指定时间,也可以不指定。
sleep() 必须指定时间
2,wait(), 释放cpu资源,释放锁
sleep(): 释放cpu资源,不释放锁
异常会提示发生在哪个线程上,
异常会结束线程任务,也就是可以结束所在线程。
***如何停止线程?
原理:让run方法结束。
线程任务通常都有循环。因此开启线程就是为了执行需要一些时间的代码。
只要控制住循环,就可以结束run方法,就可以停止线程。
控制循环弄个标识即可,定义变量。
t1.interrupt() //将t1中断了,从冻结状态强制唤醒,又判断循环。
**守护线程:即后台线程。
t2.setDaemon(true);//将t2标识为后台线程
前台都结束,后台也结束
**
t1.join();//等待该线程终止。
让出执行权让t1执行,直到t1终止。
***优先级
Thread.currenThread().toString() // 返回该线程的字符串表现形式,包括线程名称,优先级和线程组
设置优先级 setPriority(); 获取getPriority()
t1.setPriority(Thread.MAX_PRIORITY);//设置优先级数为10
yield() // 暂停当前正在执行的线程对象,并执行其他线程。
相关文章推荐
- java中抽象类一般什么时候用到,用抽象类有什么好处?
- ConcurrentHashMap
- 打卡
- iOS-UI控件之UITableView(四)- cell数据刷新
- 【学习笔记】【C语言】文件的包含
- iOS-UI控件之UITableView(三)- 自定义不等高的cell
- AngularJs自定义指令详解(5) - link
- Drupal 性能优化[翻译自《Pro Drupal 7 Development》]
- JedisPool连接池实现难点
- JedisPool使用原理和源代码
- Gensim官方教程翻译(四)——相似度查询(Similarity Queries)
- session与缓存
- [LeetCode] Median of Two Sorted Arrays
- 耐性
- hdoj 1534 Schedule Problem 【差分约束】【SPFA求最长路】
- Tair分布式key/value存储
- ext4禁用日志功能
- TabHost的使用及Tabwidget的颜色设置
- 【Android基础篇】Activity的生命周期
- rails第一次做项目