本文最后更新于 about 3 years ago,文中所描述的信息可能已发生改变。
首先,什么是线程
在讨论“线程”这个概念之前,我们有必要知道它到底是什么。这个词经常和"进程"一起出现,那么这两者有什么区别呢?
进程是对 CPU 活动的称呼,简单说来就是执行的程序。当然它肯定不止“程序”这么简单,一个完整的进程应该包括代码段(文本)、数据段、栈、堆等部分。
至于线程,《操作系统概念》是这样定义它的:
线程是 CPU 使用的一个基本单元;它包括线程 ID、程序计数器、寄存器组和堆栈。
基于这些,我给出个人的理解:如果说进程是操作系统层面的程序基本单位,那么线程更像是 CPU 执行任务的基本单位。~~众所周知,~~一个进程可以包含多个线程,拥有多个控制线程的进程可以同时执行多个任务。
打个比方,多线程的程序就像眼睛盯着屏幕手里还搓着手柄的你,单线程的程序就像要看一眼屏幕再看一眼手柄上的按键才能操作的你。是不是很形象?
嘶~或许还有点并行和并发的意思?
在 Java 中使用线程
为什么需要多线程编程?这就很好理解了。如果一个程序要同时处理多个任务,不管这些任务是相似的还是完全不同的,有多个线程时效率一般都会比较高(嗯)。
在 Java 中使用多线程很简单,可以直接使用继承线程(Thread)类,也可以实现 Runnable 接口。就稍微讲一下使用线程类的方法好了。
Thread
类的对象和其他对象一样具有属性和方法。
启动线程
Thread
类中有一个 run()
方法,其子类需要实现这个方法。实例化线程,创建对象之后,调用 start()
方法才算是启动了线程。
直接调用 run()
方法和调用普通方法没有区别,不会启动新的线程。
线程的状态
线程可以有如下几个状态:
- 新建:实例化线程对象后,还未执行
start()
时; - 就绪:调用
start()
后,处于就绪状态的线程等待调度; - 运行:当线程获得 CPU 资源后就可以执行
run()
方法,此时线程就处于运行状态,处于运行状态的线程可能变为阻塞、就绪或死亡状态; - 阻塞:线程失去所占用资源后进入阻塞状态,具体原因包括睡眠、等待以及同步锁被占用等等,重新获得资源后线程可以重新进入就绪状态;
- 死亡:线程执行完
run()
方法或者因其他原因终止时进入死亡状态,即结束。
状态之间的转换构成了线程的生命周期。
其他要讲的
- 在 Java 中,线程有优先级,取值范围从1到10,数值越大优先级越高,默认优先级是5;
- 多线程编程:线程间的同步、通信等内容……
先不写了,才不是因为懒。