首先说一下进程和线程的区别

进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立;

线程: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不需要

写了一个同步锁例子,三个子线程依次打印

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. Thread thread1=new ChildThread("thread1");
  4. Thread thread2=new ChildThread("thread2");
  5. Thread thread3=new ChildThread("thread3");
  6. thread1.start();
  7. thread2.start();
  8. thread3.start();
  9. }
  10.  
  11. public class ChildThread extends Thread{
  12. private static List<ChildThread> dataSource=new ArrayList<>();
  13. private static Object lockObj=new Object();
  14. private static int MaxLength=5;
  15. private int currentNumber=1;
  16. private String name;
  17. public ChildThread(String name) {
  18. this.name=name;
  19. dataSource.add(this);
  20. }
  21.  
  22. @Override
  23. public void run() {
  24. super.run();
  25. while (currentNumber<=MaxLength) {
  26. synchronized (lockObj) {
  27. boolean isbellow = isBellow();
  28. if(isbellow){
  29. Log.i(" " ,String.format("%s=%s",name,currentNumber));
  30. currentNumber++;
  31. lockObj.notifyAll();
  32. }
  33. else{
  34. try {
  35. lockObj.wait();
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }
  42. }
  43.  
  44. private boolean isBellow(){
  45. boolean isBellow=true;
  46. for (ChildThread childThread:dataSource) {
  47. if(currentNumber>childThread.currentNumber){
  48. isBellow=false;
  49. break;
  50. }
  51. }
  52. return isBellow;
  53. }
  54. }
  55.  
  56. 结果如下

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

  1.  

Java多线程理解的更多相关文章

  1. 从JAVA多线程理解到集群分布式和网络设计的浅析

    对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...

  2. 关于java多线程理解到集群分布式和网络设计的浅析

    对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...

  3. java多线程理解及实现

    其实多线程也很好理解,就好比我们坐高铁.飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码 线程实现的三种方式: 一.继承Thread类创建线程类 ...

  4. java多线程理解2

    1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...

  5. Java多线程-----理解CountDownLatch

       CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...

  6. Java多线程理解:线程安全的集合对象

    1.概念介绍 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...

  7. (转载)Java多线程入门理解

    转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

  8. java多线程的理解

    java多线程的理解   线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行) Thread.yield:   线程 运行 ...

  9. 关于java多线程中异常捕获的理解

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

随机推荐

  1. mac系统,git上刚刚checkout出来的文件,一检查,发现已经被修改过了,怎么破???

    如下图中所示: 事实上,checkout之后什么都还没做,这些文件为何就被修改? 检查一下别的电脑上所存放的同一套源码,原来出问题的文件都是同名文件,只不过是有大小写区分而已!!! linux系统可以 ...

  2. NPOI支持excel2003和excel2007

    IWorkbook wk = null; if (filePath.ToLower() == ".xls") { wk = new HSSFWorkbook(fs); } else ...

  3. LDAP与jenkins

    1:下载:jenkins.war 2:运行:java -jar jenkins.war  一直让他开着,后者放到后台进程 3:在浏览器输入http://IP:8080   4:设置LDAP     若 ...

  4. bootstrop验证手机号

    formValidate($form,getRules(),getMessages()); function getRules(){ return { "memberViewVo.membe ...

  5. JVM内存模型和启动参数的关系

    今天开始接触JVM的内存模型这一块的内容,以下这张图是从网上找的,先收藏了,虽然现在还看不太懂.以后弄懂了才进行详细的解说.

  6. git & scp

    git & scp command : git & scp git git 提交 git checkout/pull =====[在提交前校验远程是否有冲突] git add [< ...

  7. 移动APP开发使用什么样的原型设计工具比较合适?

    原型设计工具有Axure,Balsamiq Mockups,JustinMind,iClap原型工具,等其他原型工具.其中JustinMind比较适合APP开发使用. JustinMind可以输出Ht ...

  8. Maven pom.xml 配置说明: 打jar包不包括指定资源文件和.class xml,配置不跑testCase,建pom父子项目

    **maven如何配置打jar包时,一些class 或者资源文件不打进来,把classpath的xml文件打进jar <build> <!--针对资源文件--> <res ...

  9. linux开机启动程序

    一./etc/rc.local这是一个最简单的方法,编辑“/etc/rc.local”,把启动程序的shell命令输入进去即可(要输入命令的全路径),类似于windows下的“启动”. 使用命令 vi ...

  10. 大前端学习笔记整理【四】LESS基础

    第一次接触CSS预编译,然后对比后发现其实less的上手容易度确实比sass高不少,再加上公司项目也是使用的less.所以想想还是根据网上的各种教程,整理出来了一些比较基础的.而且比较能让我们这种初学 ...