为了满足业务需求,无论PC(个人计算机)还是智能手机(Smart Phone)现在都支持多任务,都能够编写并发访问程序。多线程编程可以编写并发访问程序。
在多线程OS(操作系统)中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。一般可以在同一时间内执行多个程序的操作系统都有进程的概念。
打开Windows当前运行的进程,如图所示:

进程
一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。
在Windows操作系统中一个进程就是一个exe或者dll程序,它们相互独立,互相也可以通信,在智能手机操作系统中进程间的通信应用也是很多的。
线程
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序控制的流程,但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时,开销要比进程小的多,正因如此,线程被称为轻量级进程。一个进程中可以包含多个线程。
主线程
Java程序至少会有一个线程,这就是主线程,程序启动后是由JVM(Java虚拟机)创建主线程,程序结束时由JVM停止主线程。主线程和子线程的关系是主线程它负责管理子线程,即子线程的启动、挂起、停止等等操作。
进程、主线程和子线程关系如图所示:

获取主线程示例代码如下:
publicclass MyThread{
publicstatic void main(String[] args) {
//获取主线程
Thread thread= Thread.currentThread();
System.out.println("主线程名:" + thread.getName());
}
}
线程的状态
在线程的生命周期中,线程会有几种状态,如图所示,线程有5种状态。下面分别介绍:

1. 新建状态
新建状态(New)是通过new等方式创建线程对象,它仅仅是一个空的线程对象。
2. 就绪状态
当主线程调用新建线程的start()方法后,它就进入就绪状态(Runnable),此时的线程尚未真正 开 始执行run()方法,它必须等待CPU的调度。
3. 运行状态
CPU的调度就绪状态的线程,线程进入运行状态(Running),处于运行状态的线程独占CPU, 执行run()方法。
4. 阻塞状态
因为某种原因运行状态的线程会进入不可运行状态,即阻塞状(Blocked),处于阻塞状态的线 程JVM系统不能执行该线程,即使CPU空闲。如下几个原因会导致线程进入阻塞状态:
1)当前线程调用sleep()方法,进入休眠状态。
2)被其他线程调用了join()方法,等待其他线程结束。
3)发出I/O请求,等待I/O操作完成期间。
4)当前线程调用wait()方法。
5. 死亡状态
线程退出run()方法后,就会进入死亡状态(Dead),线程进入死亡状态有可以是正常实现完成 run()方法进入,也可能是由于发生异常而进入的。
线程间通信
如果两个线程之间有依赖关系,线程之间必须进行通信,互相协调才能完成(任务)工作。
例如,一个线程生成了一些数据,将数据压栈;另一个线程需要这些数据,将数据出栈。这两个线程互相依赖,当堆栈为空时,消费线程无法取出数据时,应该通知生成线程添加数据;当堆栈已满时,生产线程无法添加数据时,应该通知消费线程取出数据。
完成线程间的通信,在Java中有几个方法:
(1)void wait():使当前线程释放对象锁,然后当前线程处于对象等待队列中阻塞状态。,等待 其他线程唤醒。
(2)void wait(long timeout):同wait()方法,等待timeout毫秒时间后进入队列中阻塞状 态。
(3)void notify():当前线程唤醒此对象等待队列中的一个线程,线程将进入就绪状态。
(4)void notifyAll():当前线程唤醒此对象等待队列中的所有线程,线程将进入就绪状 态。
