嗨,你好,下面我们一起来学习线程的创建。线程呢,
它是跟进程是相对的。那么所谓的 进程呢,就是我们一个程序它在一直的执行,
当然包括这个程序里面的代码, 以及内存里面的数据等等,这一次执行过程
就是进程。那么线程呢实际上是一个进程里面 它的单个的顺序流程控制。
或者我们简单地说就是一个程序里面有多个任务,
但是这几个多个任务它们之间是可以并发地运行的,比如说一个程序里面它既要
边下载,然后又要边播放, 还要边计算等等,那么这个下载或者播放
或者计算,那这几个是独立的,或者是说是
单个的这个顺序执行流程,那就是线程。那么一个进程里面可以包含多个线程,
并且我们在操作系统里面可以查看这个线程数,以 Windows 为例啊,
在这个任务管理器里面,我们可以点右键,选择列,然后把线程数给显示出来。
请看这里,我们在任务管理器这儿有个详细信息,
详细信息呢它是把我们这每一个进程都显示出来了,
然后我们在这里有好多信息呢在这个点上面,选
选择列,这个列里面,我们把线程数,把这个线程数呢
显示出来,就是这个样子。你比如说在我这里,那么有好多程序,每一个程序它里面的线程数呢
是不一样的,所以这就是我们说一个进程里面有多个线程。
那么这些线程呢它有什么特点呢?一个是呢这些线程它是分享 CPU,
也就是说我们现在呢如果是 一个
CPU 的那个计算机呢,它实际上把 CPU 分成时间片,
那么也就是说一份运行这个,这个线程里面的 这些任务,一会儿呢又运行另一个线程里面的指令,
那么这样从总体效果来看呢,这些线程之间呢它是同时运行的。
当然如果是多个 CPU 呢,它可以把 每一个
CPU 呢分给不同的, 它可以分给不同的这个线程。
所以总的说呢是由操作系统来进行这种调度,多个线程。
同时呢,一个进程里面的线程它可以共享内存,比如说我们访问同一个 对象,访问同一个变量啊等等。Java
呢它是支持多个线程的, 那么我们有一些语言呢,它是要需要专门的这些类。
那 Java 从语言的级别,也就是最开始呢它就考虑了这个支持多线程,
比如说我们前面遇到过的这个 object,这个最基本的这个类里头啊,
它都有跟线程相关的方法,比如说 wait 啊,notify 等等,因为 Java.
lang 这个包里头就有一个类 thread,这个 thread 呢就是用来表示线程。
因为 Java 在一开始它就考虑了线程,所以实际上我们使用线程呢,
它是相当简单的,我们只需要
在线程,我们只需要告诉这个线程要执行 的任务,我们刚才讲了线程就是一个任务,一系列的任务,
这个任务呢,它实际上是用 run 方法来表示的,这个方法里面所有执行的这些指令
那就是线程体,线程要执行的任务,也就是线程启动以后呢,系统呢它就会自动调用这个 run 方法。
一般来说呢线程里面这个 run 方法呢,它是执行
一个时间比较长的一个操作,比如说一个循环,这个循环 它要执行很多任务,或者呢显示一系列图片,
或者呢下载一个文件等等,所以线程呢最常用于这种 执行时间比较长的这些任务。
那我们具体用那个线程, 就是相当简单的。第一种做法呢是
extends 这个 thread 类,那么 override 重写这个 run
方法,然后在这里面呢 我们就写上我们需要的任务,比如说一个循环它要做什么什么事情,这是一种。
另一种呢我们也可以在 thread 呢 构造方法里面传递个
runnable 对象,runnable 呢是一个接口,这个接口呢它本质上也就是一个
run 方法, 无论是重写这个 thread 这个类,还是
用 runnable 这个接口,那么它最终呢都是要告诉这个
thread 一个 run 方法,这个 run 方法呢然后就可以
构造一个 thread 对象,然后用 thread.start
就可以启动这个线程。所以我们只需要这两种方法之一, 我们就可以呢告诉它
run 方法,从而启动这个线程,那么这个线程呢就,
这个系统呢去独立地去运行这个线程。
那当然我们在线程书写的时候呢也可以使用这个匿名类来实现这个 runnable,
匿名的这个类。那具体用的是 new
一个 thread,然后 override 这个 run 呢,直接在 new 的同时呢 也就
override run 这个方法,然后 run 方法里面写我们要执行的任务。
或者呢用 Lambda 表达式,在 Java8 以上呢我们可以直接
new 一个 thread,这个 runnable 这个接口呢我们直接写成一个 Lambda
表达式,也就是不带参数, 然后一个箭头号,一个圆括号、一个箭头号,
然后这个花括号里面写我们所需要执行的这些任务。
然后这个 new 一个 thread.start 就可以了。所以这几种写法呢都可以,我们具体的呢
有这几个例子,这里呢 你下面可以具体把这个代码拿来看一下。