在介绍java线程之前。需要提到两个名词——程序和进程。 很多人可能分不清程序和进程之间的区别。
先简单概括一下程序和进程吧。
程序:为了完成特定任务,用某种语言编写的一组指令集合。用通俗的话来说就是我们写的代码。
进程是指运行中的程序,比如我们使用微信,qq等,就启动了一个进程,操作系统会为该进程分配内存空间。进程是程序的一次执行过程,或是正在运行的一个程序。
简单来说,当我们启动了一个程序,它运行了,就是一个进程。进程会占用内存空间,即程序启动了就会占用空间。
现在我们来介绍线程: 线程分为多线程和单线程。
单线程:同一时刻,只允许执行一个线程
多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口;一个百度网盘进程,可以同时下载多个文件。
这里我们引入并发和并行的概念,有些小伙伴可能并没有弄清楚并发和并行的概念。
并发就是某一个时刻只能执行一个任务,但他会在多个任务之间来回切换,这样我们在某一段时间看起来他就像多个任务同时做。一个很生活化的例子就是开车打电话,即使我们看起来是在同时进行,但是某一个时刻我们的大脑只能二者选其一进行。
并行就是同一个时刻,执行了多个任务。
接下来我们开始了解下,线程是怎么使用的。
线程的使用有两种,一个是继承Thread类,一个是实现Runnable接口。
上图我们可以知道,Thread类实现了Runnable接口、 不管我们是继承Thread类,还是实现Runnable接口,最终我们都要通过重写run()方法来开启线程。
这里值得一谈的是,真正实现我们线程的并不是run方法,而是run方法里面的start0()
那么这两者有什么区别吗?
实现Runnable接口方式更适合多个线程共享一个资源的情况,而且它避免了单继承的限制。建议是使用Runnable接口,但是具体看个人习惯,这里只是建议。