线程学习之线程初识
一、程序、进程、线程的介绍
程序:
程序是一组静态的数据或者代码。
进程:
进程是程序执行的一次过程(运行中的程序),是计算机系统运行的基本单位,是动态的。例如我们平时使用电脑打开一个腾讯课堂软件,这就是一个进程。
线程:
线程与进程类似,但是线程是一个比进程更小的单位。一个进程在运行的过程中会产生多个线程。一个进程至少包含一个线程。一个进程之间的多个线程共享进程的 堆 和方法区资源,但每个线程拥有自己的虚拟机栈、本地方法栈、程序计数器,多个线程之间可以自由切换,但是对系统的开销要比进程小,所以线程也叫轻量级进程。
运行时数据区域图如下(图来源于网络)
二、进程和线程的区别
1. 一个进程可以包含多个线程(至少包含一个线程),一个进程的多个线程共享进程的 堆 和方法区资源,但是拥有自己的虚拟机栈、本地方法栈、程序计数器;
2. 线程是进程中划分的更小的单位。各个进程之间是相互独立的,但是各个线程之间则不一定,一个进程中的多个线程之间极有可能相互影响。
3. 进程之间的进行切换的开销大,线程之间进行切换的开销比进程小。
三、创建线程的方式
方式一:继承Thread类
-
自己定义一个线程类
-
继承父类Thread
-
重写run()方法
-
new一个线程对象,调用start()方法,让线程进入就绪状态
方式二:实现Runnable接口
-
自己定义一个线程类
-
实现Runnable接口
-
重写run()方法
-
new一个线程对象,创建一个Thread对象将我们new出的对象包装起来,然后调用start()方法,让线程进入就绪状态
注:Thread类实现了Runnable接口,start()方法在Thread类中,所以在用Runnable接口创建线程的时候,需要先将实现Runnable接口的线程类构建为Thread类,再调用start()方法。
实现Runnable接口与继承Thread类相比的优势
-
通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况;
-
可以避免单继承所带来的的局限性;
-
任务与线程本身是分离的,提高了程序的健壮性;
-
线程池技术接受Runnable接口实现的线程,不接受Thread类型的线程