Android Java 并发程序系列----你应该知道的线程二
来源:互联网 发布:java jdk1.6 32位 编辑:程序博客网 时间:2024/06/05 20:53
接着上篇没有说完的博文继续,我们来谈谈线程的基础操作:(其实很多东西都是一搜一堆,这里我都尽量说的简单点)
wait和notify:这个大家可以看看这个博文http://blog.csdn.net/hudashi/article/details/7001070;
suspend和resume:这是两个要被废弃的方法了,主要原因就是挂起的线程不会释放锁,必须要被resume唤醒,用处不大,不推荐使用,此处略微提一下
**join和yield:**join,就是加入的意思,线程A执行到某个地方,可能需要线程B配合,那么线程B可能还在做他自己的任务,这时候A线程里面调用B.join(),那么A线程就会等B线程执行完了再继续走。
至于yield:当某线程调用yield的时候,他会释放他自己的资源,让别的线程有机会获得资源执行,但是,他释放了资源不代表他不会再次获得资源,也就是说,我发个红包,可能最后还是我自己抢了。。。
synchronize关键字:这算啥老生常谈了,这是最简单的保证线程安全和线程同步的办法,并且能保证可见性和保证有序性,不过弊端就是性能开销比较大。。
说了这么多相信对于很多人是没有一点收获的,那么下面我们来看看一个错误 synchronize 的用法吧。。。
public static void main(String[] args) { Thread addThread1 = new Thread(new AddTask()); Thread addThread2 = new Thread(new AddTask()); addThread1.start(); addThread2.start(); try { addThread1.join(); addThread2.join(); System.out.println("我们期望的值是:2000 实际是:"+AddTask.num); } catch (InterruptedException e) { e.printStackTrace(); } } static class AddTask implements Runnable { public static Integer num = 0; @Override public void run() { for (int i1 = 0; i1 < 1000; i1++) { synchronized (num){ num++; } } } }
上面這段代码运行的结果是一个远远小于2000的数值,这段看起来没有问题的代码问题在什么地方呢?其实如果你认真看看编译器的提示,是可以发现这么一段话的 “synchronize on a non-final field ‘num’”,其实就是告诉我们一个integer是一个不可被修改对象,每次 ++ 其实都是一个不同的对象,那么 你这个锁其实。。。木有卵用。。。因为你加锁的对象其实一直都在变。
到这里,线程基础知识就不准备在赘述了,毕竟都不是初学者,这些简单的东西 ,就当热热身,下篇博文应该就是正式进入我们这系列的主题,并发编程了。。。
- Android Java 并发程序系列----你应该知道的线程二
- Android Java 并发程序系列----你应该知道的线程一
- Android Java 并发程序系列----你应该知道的多线程概念
- Android Java 并发程序系列
- Android开发,你应该知道的
- 你所应该知道的Android设计
- Android开发,你应该知道的
- Android Fragment 你应该知道的一切
- 【Android】Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- 记住密码案例
- android WebView详解
- HttpClient使用详解
- 前端学HTTP之字符集
- Python连接MySQL数据库
- Android Java 并发程序系列----你应该知道的线程二
- 苏宁易购倒计时加封装js
- 《CSS权威指南》读书笔记6
- 猜字母小游戏
- 前端学HTTP之实体和编码
- 参照MyEclipse/eclipse设置notepad++的快捷键
- LauchMode(Activity的启动模式)
- Libevent编程-捕获 signal
- Android The specified child already has a parent.解决方法