在操作系统中,一个独立的正在运行的程序称为进程,通常一个程序又被分为称作任务的小块,任务又可以进一步分为称作线程的更小的块。如果一个程序多于一个线程同时执行,就可以称为多线程并行。
一个线程被定义为一个单一的连续控制流,线程也可以成为执行环境或者轻量级程序。当一个程序发起之后,会首先生成一个缺省的线程,这个线程被称作主线程,就是由main方法引导进入的线程,main方法调用的方法结构会在这个主线程中顺序执行。如果在线程中新建并启动的线程称为从线程。从线程也有自己的入口方法,这是由开发者自己定义的。
多线程程序比多进程程序需要更少的管理成本。进程是重量级的任务,需要为他们分配自己独立的内存资源。进程间的通信是昂贵而受限的,由于每个进程内存资源是独立的,所以进程间的转换也需要很大的系统开销。线程则是轻量级的任务,它们只在单个进程作用域活动,可以共享相同的地址空间,共同处理一个进程。线程间的通信和转换是低成本的,因为它们可以访问和使用同一个内存空间。
当java程序使用多进程任务处理程序时,多进程程序是不受jvm控制的,即jvm不能操纵进程暂停或者继续。而多线程则是受jvm控制,这正是由于java支持多线程操作。使用多线程的优势在于可以编写出非常高效的程序。程序运行中除了cpu外,还要使用键盘、硬盘等外部输入存储设备,还经常使用网络设备进行数据传输。这些设备的读写速度都比cpu执行速度慢很多,因此程序经常等待接收或者发送数据。使用多线程可以充分利用cpu资源,当一个线程因为读写需要等待时,另外一个线程就可以运行了。
在java中,线程有如下几种状态:
1. 新建(new):当创建线程后处于该状态
2. 就绪(ready):创建线程后调用start()方法后,线程处于就绪状态
3. 运行(running):当处于就绪的线程得到cpu资源后将处于运行状态
4. 挂起(suspend):程序可以在运行中将线程暂停挂起
5. 阻塞(block):运行中的线程如果遇到读写或者其他堵塞条件,将转入阻塞状态
6. 恢复(resume):当处于阻塞状态的线程如果获得资源时或者阻塞事件结束则线程恢复执行
7. 终止(terminate):当线程遇到异常或者执行结束则终止