专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java变量生命周期

Java基础学习:java变量生命周期

更新时间:2020-04-03 16:04:06 来源:星辉 浏览3013次


  1.1. 线程生命周期和状态(重点)


Java基础学习:java变量生命周期


  新建:当程序使用new创建一个线程后,该线程处于新建状态,此时他和其他java对象一样,仅仅由Java虚拟机为其分配内存并初始化成员变量值。


  可运行状态:RUNNABLE状态实际上可细分成两种状态,READY和RUNNING。分别表示就绪状态和运行状态。


  就绪状态:当线程对象调用start()方法后,该线程处于就绪状态,进入线程队列排队。此时该状态线程并未开始执行,仅表示可以运行了。至于该线程何时运行,取决于CPU调度器的调度。


  运行状态:表示某线程对象被CPU调度器的调度,执行线程体。就绪状态和运行状态是可以相互切换的,切换的原因依旧参照CPU调度器调度了哪一个线程。


  阻塞状态:正在运行的线程遇到某个特殊情况如,同步、等待I/O操作完成等。 进入阻塞状态的线程让出CPU资源,并暂时停止自己的执行。


  等待状态:有时一个可运行状态线程转变成等待状态,它会等待另一个线程来执行一个任务,一个等待状态的线程只有通过另一个线程通知它转到可运行状态,才能继续执行。


  计时等待状态:进入等待状态的线程如果没有其他线程对象来唤醒它,那么该线程对象将一直等待下去,此时我们可以考虑设计一个类似于闹钟一样的提示器,该提示器会在等待特定时间段之后唤醒该线程对象。


  终止状态:即死亡状态,表示线程终止。当线程成功执行完成或线程抛出未捕获的Exception或Error或调用线程的stop方法(易导致死锁,不推荐)。


  1.2. 操作线程的方法(掌握)


  1.2.1. join方法(了解)


  join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。


  比如在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。


  1.2.2. sleep方法(了解)


  sleep方法让正在执行的线程暂停一段时间,进入阻塞状态,常常用来模拟网络延迟等。


  sleep(long milllis) throws InterruptedException:毫秒为单位


  调用sleep()后,在指定时间段之内,该线程不会获得执行的机会


  1.2.3. 线程的优先级(了解)


  每个线程都有优先级,优先级的高低只和线程获得执行机会的次数多少有关。并不是说优先级高的就一定先执行,哪个线程的先运行取决于CPU的调度;


  Thread对象的setPriority(int x)和getPriority()用来设置和获得优先级。


  1.2.4. 后台线程(了解)


  所谓后台线程,一般用于为其他线程提供服务。也称为守护线程。JVM的垃圾回收就是典型的后台线程。


  特点:若所有的前台线程都死亡,后台线程自动死亡。


  Thread对象setDaemon(true)用来设置后台线程。


  setDaemon(true)必须在start()调用前,否则抛IllegalThreadStateException异常。


  2. 线程安全性


  2.1. 继承方式VS实现方式(掌握)


  当多线程并发访问同一个资源时,会导致线程出现安全性的原因,看案例。


  案例:现有50个苹果,现在有请三个童鞋(小A、小B、小C)上台表演吃苹果。


  因为A、B、C三个人可以同时吃苹果,此时得使用多线程技术来实现这个案例。


  分析: 可以定义三个线程对象,并启动线程.


  第一步:每一个同学吃苹果的时候:先展示自己拿到手上苹果的编号,如1,2,3,36...


  第二步:再吃掉苹果(意味着苹果的总数少一个)


  方式1:可以使用继承Thread方式来实现.


  方式2:可以使用实现Runnable方式来实现.


  使用继承方式


Java基础学习:java变量生命周期


  使用继承方式完成该案例的时候,会发现A、B、C都各自吃了50个苹果,为何?


  使用实现方式


Java基础学习:java变量生命周期


  在使用实现方式的时候,我们发现A、B、C一共吃了50个苹果,为何?


  通过吃苹果比赛,分析继承方式和实现方式的区别:


  继承方式:


  Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了。


  从操作上分析,继承方式更简单,获取线程名字也简单。


  从多线程共享同一个资源上分析,继承方式不能多个线程共享同一个资源。


  实现方式:


  Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅)。


  从操作上分析,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用。


  从多线程共享同一个资源上分析,实现方式可以多线程共享同一个资源。


  以上就是星辉java培训机构的小编针对“Java基础学习:java变量生命周期”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>