我们写的大部分程序,都只是在做单线程的编程。程序虫main()方法开始执行,依次向下执行每行代码,直到运行结束。单线程的程序往往功能非常有限,单线程的程序只有一个顺序执行流,多线程的程序则可以包括多个顺序执行流,多个顺序之间互不干扰。Java语言提供了非常优秀的多线程支持,本文将详细介绍java多线程编程的相关方面,包括创建、启动线程、控制线程。
线程与进程
几乎所有的操作系统都支持进程的概念,所有运行的任务通常对应一个进程。当一个程序进入内存运行时,即变成一个进程。进程是出于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。
进程的三大特征:
- 独立性:进程是系统中独立存在的实体,它拥有自己独立的资源和地址空间。
- 动态性:进程和程序的区别在于,程序是一个静态的指令集合,进程是一个正在系统中活动的指令集合
- 并发性:多个进程可以在单个处理器上并发执行,进程之间互不干扰
对于一个CPU而言,它在某个时间点只能执行一个程序,也就是说,只能运行一个进程,CPU在这些进程之间轮换执行。
多线程拓展了多进程的概念,使得进程可以同时并发处理多个任务。线程也被称作轻量级进程,线程是进程的执行单元。线程在程序中是独立的、并发的执行流。当进程被初始化后,主线程就被创建了。对于绝大多数程序来说,只有一个主线程。
线程的创建和启动
- 通过集成Thread类来创建并启动多线程
public class testThread extends Thread {
public static void main(String[] args) {
//创建线程
new testThread().start();
new testThread().start();
}
/**
* 线程执行
*/
public void run()
{
for(int i = 1; i<100; i++)
{
System.out.println(getName()+"---"+i);
}
}
}
- 实现Runnable接口创建线程类
public class testThread implements Runnable {
public static void main(String[] args) {
//创建线程
testThread st = new testThread();
new Thread(st, "xiancheng1").start();
new Thread(st, "xiancheng2").start();
}
/**
* 线程执行
*/
public void run()
{
for(int i = 1; i<100; i++)
{
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
线程的生命周期
- 新建和就绪状态;当使用new关键字创建了一个线程之后,该线程就处于新建状态,当线程对象调用start()方法之后,该线程处于就绪状态。线程何时开始运行,取决于jvm里线程调度器的调度。
- 运行和阻塞状态;如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则线程处于运行状态。当发生以下几种情况时,线程会进入阻塞状态:1、线程调用sleep()方法;2、线程调用了一个阻塞式IO方法;3、线程正在等待某个通知;4、程序调用了线程的suspend()方法将线程挂起。
- 线程死亡;1、run()或call()方法执行完成,线程正常结束;2、线程抛出一个未捕获的Exception或Error;3、直接调用该线程的stop()方法来结束该线程。