1.认识多线程(Thread)
1.1概念
1) 线程是什么
一个线程就是一个
"
执行流
".
每个线程之间都可以按照顺讯执行自己的代码
.
多个线程之间
"
同时
"
执行着多份代码.
例子:
银行的例子。我们主要描述的是个人业务,即一个人完全处理自己的
业务。我们进一步设想如下场景:
一家公司要去银行办理业务,既要进行财务转账,又要进行福利发放,还得进行缴社保。
如果只有张三一个会计就会忙不过来,耗费的时间特别长。为了让业务更快的办理好,张三又找
来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,
自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。
此时,我们就把这种情况称为多线程,将一个大任务分解成不同小任务,交给不同执行流就分别
排队执行。其中李四、王五都是张三叫来的,所以张三一般被称为主线程(
Main Thread
)。
2)
为啥要有线程
首先
, "
并发编程
"
成为
"
刚需
".
单核
CPU
的发展遇到了瓶颈
.
要想提高算力
,
就需要多核
CPU.
而并发编程能更充分利用多核
CPU
资源
.
有些任务场景需要
"
等待
IO",
为了让等待
IO
的时间能够去做一些其他的工作
,
也需要用到并发编
程
.
其次
,
虽然多进程也能实现 并发编程
,
但是线程比进程更轻量
.
创建线程比创建进程更快
.
销毁线程比销毁进程更快
.
调度线程比调度进程更快
3)
进程和线程的区别
进程是包含线程的
.
每个进程至少有一个线程存在,即主线程。
进程和进程之间不共享内存空间
.
同一个进程的线程之间共享同一个内存空间
比如之前的多进程例子中,每个客户来银行办理各自的业务,但他们之间的票据肯定是不想让别
人知道的,否则钱不就被其他人取走了么。而上面我们的公司业务中,张三、李四、王五虽然是
不同的执行流,但因为办理的都是一家公司的业务,所以票据是共享着的。这个就是多线程和多
进程的最大区别。
进程是系统分配资源的最小单位,线程是系统调度的最小单位。
并发、并行、串行
并发:同一个对象被多个线程同时操作。(这是一种假并行。即一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉)。
并行:多个任务同时进行。并行必须有多核才能实现,否则只能是并发。
串行:一个程序处理完当前进程,按照顺序接着处理下一个进程,一个接着一个进行。
并发:同一个对象被多个线程同时操作。(这是一种假并行。即一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉)。
并行:多个任务同时进行。并行必须有多核才能实现,否则只能是并发。
串行:一个程序处理完当前进程,按照顺序接着处理下一个进程,一个接着一个进行。
1.2
第一个多线程程序
感受多线程程序和普通程序的区别
:
每个线程都是一个独立的执行流
多个线程之间是 "
并发
"
执行的
.
使用
jconsole
命令观察线程
1.3
创建线程
继承
Thread
类
1)
继承
Thread
来创建一个线程类
.
以下是代码
运行结果:
lambda
表达式创建
Runnable
子类对象