说到线程,首先想到的是进程的概念。
进程:是一个正在执行中的程序。每一个进行执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
进程vs线程:一个进程中至少有一个线程。
Java VM 启动的时候会有一个进程java.exe。该进程中至少一个线程负责Java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。
创建线程的2种实现方式:
1、继承Thread。
2、实现Runnable。
继承Thread的步骤:
1、继承Thread方法。
2、复写Thread类中的run方法
目的:将自定义代码存储在run方法。让线程运行。
3、调用线程的start方法。
作用2个:启动线程;调用run方法。
实现Runnable的步骤:
1、定义类实现Runnable接口
2、覆盖Runnable接口中的run方法
将线程要运行的代码存放在该run方法中。
3、通过Thread类建立线程对象。
4、将Runnable接口的子类对象作为实际参数传递给thread类的构造方法
因为自定义的run方法所属的子类对象是Runnable接口的子类对象。所以要让线程去指定对象的run方法。就必须明确该run方法所属对象。
5、调用Thread类的start方法开启线程并调用runnable接口子类的run方法。
两种方式对比:
它们的线程代码存放的位置不一样。
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable:线程代码存在接口的子类的run方法中。
实现Runnable接口的方式避免单继承的局限性。
线程的运行状态:创建、运行、冻结、消亡、阻塞。
冻结到运行之前,先到阻塞状态(此时具有执行资格),等待cpu资源。拿到cpu资源了,也就是具有了执行权限了,才会进入运行状态。
总结:
多线程,在有一定的代码量的基础上去理解,更有一种水到渠成的感觉。
下一篇会介绍多线程的线程安全问题。