java多线程的理解
java多线程的理解
线程的5种状态:新建,就绪,运行,阻塞,死亡。
Thread.sleep:线程 运行状态 转为 阻塞状态,(其它线程启动运行)
Thread.yield: 线程 运行状态 转为 就绪状态,(同优先级线程启动运行)
ThreadA.join:等待ThreadA执行完成。
线程的两种方式:
继承自Thread,实现Runnable.
在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。
线程的同步:
同步代码块:同步加锁的是对象,而不是代码。
synchronized(Object A){
}
同步监视器是A,表示的是一个临界区。
同步方法:
synchronized Method1(){
}
synchronized Method2(){
}
同步锁:
Lock lock = new ReentrantLock();
public Mehtod1(){
lock.lock();
finally{
lock.unlock();
}
}
public Mehtod2(){
lock.lock();
finally{
lock.unlock();
}
}
同步监视器的释放:
1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。
2.在同步方法或者同步代码块中出现了error或者exception的时候。
3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。
下面的情况不会释放同步监视器:
1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。
2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。
线程的通信:
同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。
如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;
如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。
wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。
notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。
notifyAll:唤醒在同步监视器上等待的所有线程。
java多线程的理解的更多相关文章
- (转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...
- 温故知新-java多线程&深入理解线程池
文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...
- 谈谈你对Java多线程的理解以及多线程的实现方式
说线程之前先说进程,何为进程?进程就是正在进行中的程序.比如电脑同时在运行QQ进程.cmd进程.wps进程.飞秋进程等.在某一时刻,CPU只能执行一个程序,只是在做快速切换,我们肉眼看不出来. 比如: ...
- Java多线程深入理解
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: ? 1 2 3 4 5 6 7 8 9 10 ...
- Java多线程的理解和实例
编写具有多线程程序经常会用到的方法:run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个关键字:sy ...
- Java多线程 -- 深入理解JMM(Java内存模型) --(五)锁
锁的释放-获取建立的happens before 关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...
- 关于java多线程中异常捕获的理解
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
随机推荐
- UNIX网络编程——非阻塞accept
当有一个已完成的连接准备好被accept时,select将作为可读描述符返回该连接的监听套接字.因此,如果我们使用select在某个监听套接字上等待一个外来连接,那就没有必要把监听套接字设置为非阻塞, ...
- 发运模块中如何创建Debug 文件
版本11.5.9到12.x A. 针对发运事务处理或者快速发运产生Debug文件 注意:如果通过发运事务处理执行发放,请参考B部分,下面这部分销售订单发放是格外的设置和日志文件. 1. 每一 ...
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(十一):完善游戏逻辑
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- [C++学习历程]中级部分 OpenGL第一个例子实现
作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/21488231 环境:VS2010 准备工作: 1.下载 ...
- A*寻路算法入门(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Freemarker中如何遍历List
Freemarker中如何遍历List(附源码) 关键词(Keyword):Freemarker,Freemarker遍历list 在Freemarker应用中经常会遍历List获取需要的数据, ...
- Android 面向协议编程 体会优雅编程之旅
Android中面向协议编程的深入浅出 http://blog.csdn.net/sk719887916/article/details skay编写 说起协议,现实生活中大家第一感觉会想到规则或者约 ...
- SecureCRT设置linux终端显示颜色
在linux系统上,我们使用终端时,对于文件或目录会显示不同的颜色.而SecureCRT默认显示的颜色是单一的,我们该如何让其像linux一样显示个性化颜色呢. 使用SecureCRT登录 linux ...
- android binder理解
Android中的Parcel是什么 Parcel,翻译过来是"打包"的意思.打包干什么呢?是为了序列化. 如果要在进程之间传递一个整数,很简单,直接传就是行了:如果要传 ...
- Chipmunk僵尸物理对象的出现和解决(四)
接上一篇,我们看看五角星和反弹棒碰撞时的代码: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode * ...