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 ...
随机推荐
- 使用FMDB多线程访问数据库,及database is locked的问题
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...
- Salt: Master server cannot see any Minion
Issue: When you set up a Salt Master server and several Minions, you may find that none of minions c ...
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
ROS(indigo)国外开源示例包括多机器人的V-Rep和Gazebo仿真等 1 micros_swarm_framework 使用超级经典的stage. http://wiki.ros.org/m ...
- CUDA学习,环境配置和简单例子
根据摩尔定律,每18个月,硬件的速度翻一番.纵使CPU的主频会越来越高,但是其核数受到了极大的限制,目前来说,最多只有8个或者9个核.相比之下,GPU具有很大的优势,他有成千上万个核,能完成大规模的并 ...
- 检查app的activity是否在当前
APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接.Android本来并不允许APP去监听home键 ...
- Libgdx1.6.2发布,跨平台游戏开发框架
原文地址:www.libgdx.cn [1.6.2] API更改:TiledMapImageLayer位置由整型改为浮点类型. API更改:添加GLFrameBuffer 和 FrameBufferC ...
- struts2 令牌 实现源代码 JSP
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- PO订单审批通过API
DECLARE l_return_status VARCHAR2(1); l_exception_msg VARCHAR2(4000); BEGIN mo_global.set_policy_cont ...
- 《java入门第一季》之面向对象面试题
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...
- AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能
在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...