什么是线程
线程,通常被称为轻量级的进程,是操作系统调度的最小单元。
线程是进程中的一个实体,同一个进程中的多个线程共享该进程的资源,因此会相会影响。
创建和启动线程
创建新执行线程有两种方法。
Thread
一种方法是将类声明为 Thread
的子类。并且,该子类应重写 Thread
类的 run()
方法。
1 | public ThreadClass extends Thread { |
然后,创建并启动一个线程:
1 | ThreadClass thread = new ThreadClass(); |
Runable
另一种方法是声明实现 Runnable
接口的类。然后,该类实现 run()
方法。
1 | public ThreadClass implements Runnable { |
接着,通过实例化一个 Thread
对象,并将自身作为运行目标,启动线程:
1 | Runnable r = new ThreadClass(); |
大多数情况下,如果只想重写
run()
方法,而不重写其他Thread
类的方法,那么应使用Runnable
接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。
实际上,Thread
类也实现了 Runnable
接口:
1 | public class Thread implements Runnable { |
start() & run()
start()
使线程开始执行(或者说做好随时被执行的准备),其内部调用了一个名为 start0()
的本地方法,这个本地方法会创建了真正的平台相关的本地线程,最终还会通过 Java 虚拟机调用该线程的 run()
方法。
run()
方法和普通方法没有本质区别,直接调用 run()
方法不会报错,但是却是在当前线程执行,而不会创建一个新的线程。
从方法调用的角度的看,一个线程对象只能 start()
一次,但是 run()
可以反复调用。
1 | public synchronized void start() { |
在 Java 中,每次程序运行至少启动 2 个线程:一个是 main 线程,一个是垃圾回收(GC)线程。