Java多线程理解
首先说一下进程和线程的区别
进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立;
线程:cpu执行的基本单位,拥有独立的寄存器和栈,同一进程下的线程共享地址&内存空间;线程栈存放方法的栈帧,每次方法执行都会新建栈帧压到栈顶,当线程中某个请求大小超过限制则提示StackOverflowError,当需要存储一个新的栈帧且栈内存不足则抛出OutOfMemoryError;栈帧包含局部变量、返回值、方法引用的常量池(栈帧只能存储对象的引用)
cpu可以按时间切片执行,单核cpu同一个时刻只支持一个线程执行任务,多线程并发事实上就是多个线程排队申请调用cpu,cpu处理任务速度非常快,所以看上去多个线程任务说并发处理。
线程各个状态
1、新建状态(New):新创建了一个线程对象
2、就绪状态(Runnable):创建完线程并调用start()方法后等待获取cpu使用权,获取线程丢失cpu使用权后等待下一个cpu使用权
3、运行状态(Running):处于就绪状态的线程获取到cpu的使用权,执行程序代码
4、堵塞状态(Blocked):当某线程暂时放弃cpu使用权,该线程就处于堵塞状态,且处于堵塞状态线程不再申请调度cpu
a、等待堵塞:当对象调用wait方法,当前线程进入等待池,直到等待时间到或者调用该对象的notify方法
b、同步堵塞:当线程访问带同步锁的成员,且此时该同步锁被其它线程占用,该线程进入锁池,直到其它线程释放同步锁且当前线程获取到该同步锁
初
c、其它堵塞:调用当前线程sleep方法或者调用其它线程对象的join方法,直到sleep时间到期或者其它线程任务执行完
5、死亡状态(Dead):线程任务执行完毕或者线程抛出异常
如上状态流程图大体如下

虽然sleep和wait都能使线程进入等待状态,但两个方法差别如下:
1、sleep属于Thread类对象方法,wait属于Object类对象方法
2、调用线程对象sleep方法使得该线程处于等待状态,在时间到期之前不会申请调度cpu,如果该线程持有对象锁,则该线程不会释放对象锁;调用对象wait方法,持有该对象的线程进入等待池,且该线程会放弃对象锁
3、wait,notify等必须结合Synchronized来使用,sleep不需要
写了一个同步锁例子,三个子线程依次打印
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread thread1=new ChildThread("thread1");
Thread thread2=new ChildThread("thread2");
Thread thread3=new ChildThread("thread3");
thread1.start();
thread2.start();
thread3.start();
}
public class ChildThread extends Thread{
private static List<ChildThread> dataSource=new ArrayList<>();
private static Object lockObj=new Object();
private static int MaxLength=5;
private int currentNumber=1;
private String name;
public ChildThread(String name) {
this.name=name;
dataSource.add(this);
}
@Override
public void run() {
super.run();
while (currentNumber<=MaxLength) {
synchronized (lockObj) {
boolean isbellow = isBellow();
if(isbellow){
Log.i(" " ,String.format("%s=%s",name,currentNumber));
currentNumber++;
lockObj.notifyAll();
}
else{
try {
lockObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
private boolean isBellow(){
boolean isBellow=true;
for (ChildThread childThread:dataSource) {
if(currentNumber>childThread.currentNumber){
isBellow=false;
break;
}
}
return isBellow;
}
}
结果如下
06-01 23:10:28.153 19108-19148/haozuo.com.myapplication I/: thread3=1
06-01 23:10:28.156 19108-19147/haozuo.com.myapplication I/: thread2=1
06-01 23:10:28.157 19108-19146/haozuo.com.myapplication I/: thread1=1
06-01 23:10:28.157 19108-19146/haozuo.com.myapplication I/: thread1=2
06-01 23:10:28.159 19108-19148/haozuo.com.myapplication I/: thread3=2
06-01 23:10:28.161 19108-19147/haozuo.com.myapplication I/: thread2=2
06-01 23:10:28.161 19108-19147/haozuo.com.myapplication I/: thread2=3
06-01 23:10:28.163 19108-19148/haozuo.com.myapplication I/: thread3=3
06-01 23:10:28.163 19108-19146/haozuo.com.myapplication I/: thread1=3
06-01 23:10:28.163 19108-19146/haozuo.com.myapplication I/: thread1=4
06-01 23:10:28.163 19108-19148/haozuo.com.myapplication I/: thread3=4
06-01 23:10:28.164 19108-19147/haozuo.com.myapplication I/: thread2=4
06-01 23:10:28.164 19108-19147/haozuo.com.myapplication I/: thread2=5
06-01 23:10:28.165 19108-19148/haozuo.com.myapplication I/: thread3=5
06-01 23:10:28.167 19108-19146/haozuo.com.myapplication I/: thread1=5
Java多线程理解的更多相关文章
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...
- 关于java多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...
- java多线程理解及实现
其实多线程也很好理解,就好比我们坐高铁.飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码 线程实现的三种方式: 一.继承Thread类创建线程类 ...
- java多线程理解2
1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...
- Java多线程-----理解CountDownLatch
CountDownLatch简介 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...
- Java多线程理解:线程安全的集合对象
1.概念介绍 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...
- (转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
- java多线程的理解
java多线程的理解 线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程 运行状态 转为 阻塞状态,(其它线程启动运行) Thread.yield: 线程 运行 ...
- 关于java多线程中异常捕获的理解
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
随机推荐
- c++接口实现与分离(转载)
原文地址:http://www.360doc.com/content/13/0218/10/8363527_266294787.shtml 良好的设计应该只暴露接口给用户,所有的实现细节对用户来说应该 ...
- python学习之路——基础篇(3)模块(续)
re正则表达式.shutil.ConfigParser.xml 一.re 正则元字符和语法: 语法 说明 表达式 完全匹配字符 字符 一般字符 匹配自身 abc abc . 匹配除换行符"\ ...
- 转-servlet 获取 post body 体用流读取为空的问题
目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式.在Java servlet或者springmvc中可以通过如下代码来获取并图片通过流方式传输 ...
- java keytool证书工具使用小结
java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt PEM-encod ...
- 如何使用matplotlib绘制一个函数的图像
我们经常会遇到这种情况,有一个数学函数,我们希望了解他的图像,这个时候使用python 的matplotlib就可以帮助我们. 用sigmoid函数来举个例子. sigmoid函数: 代码: impo ...
- C# 根据前台校验的值,决定是否执行后台方法
<asp:Button ID="Add" runat="server" Text="加入" class="add" ...
- python实验二:字符串排序
##统计word中的各个字符的出现的次数,并统计出所有前十名的字符使用次数 # -*- coding:utf-8 -*- word='''awfesdafhjkcasadckjsdackjsadvcn ...
- jQuery Mobile 表单输入元素
jQuery Mobile 文本输入 输入字段是通过标准的 HTML 元素编写的,jQuery Mobile 会为它们设置专门针对移动设备的美观易用的样式.您还可以使用新的 HTML5 <inp ...
- VS2010+C#+AutoCAD2008时断点调试功能无效的处理方法
把acad.exe.config文件修改为:------------------------------------------------------------------------------ ...
- Unbunt vi 编辑器键盘按键不正确的一次经历与解决方案
在 VMWare 上安装了 Ubuntu Server 14.04.1(这个默认没有安装 vim ) 我在配置网卡的时候,编辑得很心碎.键盘输入和平常vi的响应完全不一样.又不能用 SecureCRT ...