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 ...
随机推荐
- eclipse中outline中图标的含义
outline: 实心的代表方法 空心的代表属性 绿色的圆表示公有public 黄色的菱形表示保护protect 红色的方形表示私有private 蓝色的三角表示default 图形后加字母S代表该属 ...
- Java基础知识系列——目录操作
Java对目录操作的许多方法与上一篇文件操作的方法很多是一样的. java.io.File file = new File( "D:\1\2\3\4"); 1.递归创建目录 fil ...
- 轻型的ORM类Dapper
Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll.官方站点http://code.google.c ...
- C/C++ 记录时间
http://stackoverflow.com/questions/2808398/easily-measure-elapsed-time https://github.com/picanumber ...
- oracle分组后取每组第一条数据
数据格式: 分组取第一条的效果: sql语句: SELECT * FROM ( ;
- Hdu OJ 5965 扫雷(递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965 题目大意:中文题,自己读 解图思路:对于每一列都有三种情况--0, 1, 2. 如果第一列确定地 ...
- easyui的getRows和appendRow方法使用结果记录
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java 压缩字符串
1.引言 最近在做项目中,平台提供一个http服务给其他系统调用,然后我接收到其他系统的json格式的报文后去解析,然后用拿到的数据去调用corba服务,我再把corba的返回值封装完成json字符串 ...
- IT人 转型
IT人 转型 转自: http://blog.sina.com.cn/s/blog_88534dff0101232b.html “35岁,技术生涯即告终结.”这种说法在it界得到众多人认可, ...
- SUSE zypper failed to work
记录解决的一个问题. 在SUSE 中zypper 不能使用,错误如下: hostname~ # zypper install make Refreshing service 'packman'.Une ...