目录
1.1.4.1同步(Synchronous)与异步(Asynchronous)
1.1.2.3 实现Callable 重写call方法,配合FutureTask
1、线程基础
1.1基本概念
1.1.1 进程与线程
1.1.1.1 什么是进程
进程是指运行中的程序。比如浏览器,系统会给这个程序分配一定的资源
1.1.1.2 什么是线程
线程是CPU调度的基本单位,每个线程都是执行一个进程中的某一块代码程序片段。进程
1.1.1.3 两者间的联系和区别
- 进程就是线程的容器,需要线程利用进程中的一些资源,处理一个代码、指令。最终实现进程锁预期的结果。就如同房子和里面的人,房子看做是进程,而人看做是线程,人在房子中做事情 ,如吃饭,学习等。
- 两者间根本上不同:进程是操作系统分配的资源,而线程是CPU调度的基本单位
- 资源方面:同一个进程下的线程共享进程资源,而不同的线程本身也可以拥有独立的存储空间,而不同的进程之间相互独立。
- 数量不同:一个进程中至少会拥有1个到多个线程。
- 开销不同:线程是进程中的一个部分,建立和销毁都要比进程快得多,进程之间通讯会比较麻烦,需要借助内核才能实现,而线程之间通讯则简单得多
1.1.2 多线程
1.1.2.1 什么是多线程
多线程是指:一个进程内运行的多个线程,多线程的目的是为了提高CPU的利用率,用以提升程序的执行效率,提高用户体验。
1.1.2.2 多线程的局限
- 如果线程特别多,CPU在切换线程上下文时,会额外造成消耗。(优化:线程数的设置)
- 任务的拆分需要依赖业务场景:有一些异构化的任务,很难对任务拆分,还有很多业务并不是多线程处理更好。
- 线程案例问题:虽然多线程带来了一定的性能提升,但如果多线程操作临界资源,可能会发生数据不一致的安全问题,甚至在涉及到锁操作时,会造成死锁。
1.1.3串行,并行,并发
1.1.3.1 什么是串行
串行就是从头到尾一个一个的顺序执行
1.1.3.2 什么是并行
并行就是同时处理,多个线程对多个cpu内核,1对1处理
1.1.3.3 什么是并发
这里的并发并不是指三高中的并发问题,是指多线程中的并发概念(CPU调度线程的概念),同一时刻多个线程访问同一个资源。
1.1.3.4 区别和联系
并行囊括并发,并行就是多核CPU同时调度多个线程,是真正的多个线程同时执行,而单核CPU则无法实现并行效果,只能高速切换线程,实现并发。
1.1.4同步异步,阻塞非阻塞
1.1.4.1同步(Synchronous)与异步(Asynchronous)
同步、异步关注的是消息通信机制(synchronous communication/ asynchronous communication)。
同步、异步分为两种情况:多线程/多进程并发的同步异步 和 I/O操作的同步异步
1)并发的同步和异步
- 同步:当调用者A发起一个调用B,在没得到结果之前,该调用B就不返回,这样导致的结果是调用者A需要一直等待,直到被调用者B返回处理结果,才能继续后续的操作。
- 异步:当调用者A发起一个调用B,被调用者B直接返回,但是此时并没有返回操作处理结果(比如说IO读写操作),等操作任务处理完成后,通过状态改变、通知或者回调函数等方式主动通知调用者A,也就是说调用者A被动接受处理结果。
- 并发的同步和异步的区别:请求发出后,是否需要等待处理结果,才能继续执行其他的操作。对于同步来说,调用者主动等待调用结果;对于异步来说,调用者是被动等待调用结果。
2)I/O操作的同步异步
对于I/O操作来说,会涉及到操作系统的内核(kernel)系统调用。因为I/O操作都是通过调用内核提供的系统调用来完成的。
当进行I/O读写操作时,涉及到内核空间和用户空间。内核空间对应的是内核态,用户空间对应的是用户态。
同步I/O操作:I/O请求操作会导致请求进程阻塞,直到I/O操作完成。I/O模型有:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O。
同步I/O的缺点:“进行I/O的过程中函数无法返回,所以导致调用该函数的进程或线程不能执行其他任务!”
异步I/O操作:I/O请求操作不会导致请求进程阻塞。I/O模型有:异步I/O。
1.1.4.2阻塞和非阻塞:
阻塞和非阻塞强调的是进程/线程在等待调用结果(消息、返回值)时的状态。
- 阻塞:在调用结果返回之间,当前进程/线程会被挂起,不能继续往下执行,被调函数只有在得到结果之后才会返回。这点和同步函数是一样的。阻塞模式会导致进程/线程挂起。
- 非阻塞:在发起一个调用后,无论结果怎样(有结果就返回结果,没有结果就返回错误。总之,它不会阻塞当前线程,而是会立刻返回)。但是要每隔一段时间来check一下之前的操作是否完成。其实,这样的过程就叫做轮询(poll)。非阻塞模式不会导致进程/线程挂起。
1.1.4.3 同步/异步 与 阻塞/非阻塞 之间的区别
同步异步指的是通信模式,即被调用者结果返回时通知进程/线程的一种通知机制。
阻塞和非阻塞指的是调用结果返回前进程/线程的状态。
参考他人的概念图:
1.2线程的创建
1.2.1线程的创建方式
1.2.1.1继承Thread类 重写run方法
费话不多说,直接上代码
public class MiTest {
public static void main(String[] args) {
MyJob t1 = new MyJob();
t1.start();
for (int i = 0; i < 100; i++) {