要了解多线程就要了解并发和并行以及线程和进程的概念。
并发和并行
并行:多个动作或者事件能够同时执行。
并发:多个动作或者事件同时存在。
比如你想去吃饭,在吃饭的时候,能同时打电话,这就是并行。如果你停下吃饭,接听电话,打完电话再去吃饭,这就是并发。如果你是吃完饭了,再去接电话那就是既不支持并发也不支持并行。
线程和进程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
在Java中创建线程有两种方式。
- 继承Thread类
public class Thread1 extends Thread{ @Override public void run(){ System.out.println("创建线程的方式继承Thread"); } public static void main(String[] args) { new Thread1().start(); }}
2. 实现Runnable类
public class Thread2 implements Runnable{ @Override public void run(){ System.out.println("创建线程的方式实现runnable"); } public static void main(String[] args) { new Thread(new Thread2()).start(); }}
注意一点:当调用线程的start()方法时,最少有两个线程在运行,一个是调用start()方法的线程,一个是执行run()方法的线程。可以使用jps和jconsole命令查看。
线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。
- 新建(NEW):就是刚使用new方法,new出来的线程;
- 就绪(RUNNABLE):就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
- 运行(RUNNNING):当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
- 阻塞(BLOCKED):在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify()或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
- 销毁(TERMINATED):如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源; 但是我们在Java的Thread.State中却发现有六种状态。其实BLOCKED、WAITING、TIMED_WAITING这三种都可以归结为BLOCKED。