【Java】java多线程

java里面的多线程可以通过集成Thread或者实现Runnable两种方式来实现多线程,在java虚拟机中每个线程都会和操作系统的线程相对应的,线程的管理是通过操作系统本身实现的。曾经在很早之前有一个绿色线程(green thread[1])的概念,green thread的线程的管理是通过虚拟机自己来管理的,不会依赖操作系统本身。使用绿色线程又不少的弊端,比如不能利用多核技术,一个线程阻塞会阻塞住其他线程。在后来随着java虚拟机的版本升级,才出现了java里一个多线程映射成操作系统的一个本地线程[2]。

下面就对多线程中的线程状态,和线程的接口进行简单的介绍。


状态转换


其中线程各个状态与转换请看截图:

从上图可以看出对于一个线程来说,其从产生到死亡可能会经历多个状态。一个线程的从创建、就绪、运行、阻塞、死亡共5个状态。其中有些状态可以两两相互变换,有些则只能是单向变化。下面则对各个状态的变化进行简单说明。

创建->就绪:这是一个线程最先经历的状态。向操作系统申请创建线程,完成创建,创建完成之后就分配除了cpu之外的所有资源,并把该线程放入到就绪队列。

就绪->运行:在就绪队列中,线程等待操作系统的调用,当某个线程等待到cpu,那么该线程就从就绪转变为运行状态,占据cpu。

运行->就绪:这是唯数不多的可以两个状态相互转化的。当某个线程在运行状态的时候,系统为你分配的运行时间达到了,那么就从运行态转化为就绪态,放入就绪队列,继续等待下一次的系统调度。

运行->阻塞:运行也可以变为阻塞状态,当某个线程需要申请某种资源,但是这个资源无法马上获得的时候,该线程就进入了阻塞状态。它释放cpu占据,进入阻塞队列,直到等待的资源可以获取到。

阻塞->运行:这个上面一个状态说了,当等待某个资源的时候,从运行到阻塞,那当该线程需要的资源竞争到了,状态就从阻塞变为就绪,等待系统调度了。记住,阻塞不能直接变为运行状态的。就算它等待的资源到来,也要从就绪态开始重新竞争cpu。


线程方法


上面简单介绍每个状态之间是如何转换的。所以介绍那几个方法就会比较容易了。

sleep:从执行中状态转变为等待中/睡眠中状态,睡眠时间结束自动转为可之执行状态等等下一步的调度;它不会存在调用notify() 或者notifyAll()被唤醒;而且其拥有的锁不会被释放,会一直拥有到睡醒,并执行结束才会释放锁;

wait使得当前线程睡眠,但调用notify() 或者notifyAll()会随时唤醒线程;在wait的时候,会把自己拥有的锁释放,被唤醒之后重新竞争锁;也有解释说,当wait(times)之后,就是显式给出休眠时间,时间到了会自动进入执行状态,而不是可执行状态,这个会在继续研究;

yield:从图中可以看出它将从执行中状态转变为可执行

而join是将一个新的A线程插入一个B线程之后,当B线程执行结束之后就执行A线程,这个类似修改线程优先级。强制提升A线程优先级,让B线程执行完就直接执行A线程,而不是调度别的线程执行。采用该方法可以完成一些特殊的使用场景。比如某个步骤必须在上一个步骤完成之后才可以完成,这个时候你就可以采用join,把一个操作join到其前置依赖的操作之后。



附录:

[1] green threads: http://en.wikipedia.org/wiki/Green_threads

[2] JVM internal: http://blog.jamesdbloom.com/JVMInternals.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值