【Java学习之从头开始】Java多线程-0——基础概念

Java多线程,一直是Java里面一个绕不去的坎,对程序员的要求比较高。同时,得益于Java社区的日益强健,Java框架也随之丰富起来了,特别是Web框架。所以大多数做Web的程序员,都是拿来就用,我就是其中一员。Web中几乎不用程序员自身去操作多线程,所以这也就导致了大多数的Java Web程序员多线程方面较为薄弱。为了解决这一问题,下定决心学习Java多线程,同时记录自己的学习过程,以供日后翻阅。

线程与进程

线程与进程一直是相互关联,而又完全不同的两个概念。

其不同在于:

  • 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

  • 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)

其关联性在于:

1、一个进程可以有多个线程,但至少有一个线程;而一个线程只能在一个进程的地址空间内活动。

2、资源分配给进程,同一个进程的所有线程共享该进程所有资源。

3、CPU分配给线程,即真正在处理器运行的是线程。

4、线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。

线程的状态

Java中线程的状态分为五个阶段:

1、新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。

2、就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。

3、运行状态(Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

4、阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

01) 等待阻塞 – 通过调用线程的wait()方法,让线程等待某工作的完成。

02) 同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

03) 其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

五种状态的转换关系如下:

更多关于线程的知识将在后续章节中,详细介绍,敬请期待……

本文作者: 张未