多线程知识点复习
1、线程是什么
简单的说 线程就是一条代码的执行流、完成一组代码的执行。一组代码往往称为一个任务
2、线程的实现方法
一般运用的有三种:继承Thread、实现Runnable接口、实现Callable接口。
但是创建线程应仅有一种方式,即new Thread()。
因为无论时实现Runnable接口还是实现Callable只是对线程的执行代码写了进去,并不是一个线程(此理解,仅供参考)
3、用多线程的目的
充分利用CPU资源,并发做多件事。
4、单核CPU机器适不适合用多线程
适合,如果是单线程,线程在执行过程之间可能会传输网络数据、读取文件这个过程时不会使用到CUP的,线程会出现需要等待IO时,此时CPU就空闲出来了。另外的线程就可以对CPU进行使用
5、线程什么时候会让出CPU
-
阻塞时:wait、 await、 等待IO时
-
Sleep:线程睡眠中 会让出CPU,但如果抢到锁后不会让出
-
yield:主动让出CPU,但是主动让出其他线程未必强的到,可能还会被自己重新抢到。即给所有线程一次公平的竞争CPU机会
-
线程结束:线程结束后CPU自动会让出来。
6、CPU做的时什么工作
执行代码:一组程序代码要去执行必须放入CPU上个执行 就需要通过线程去运送到CPU上进行执行。
7、线程是不是越多越好
线程并不是越多越好。
- 首先创建线程是需要耗时间,其次使用完需要线程销毁也需要耗时间。线程作为JAVA中的一个对象,每一个java线程都需要一个操作系统线程来支持。如果创建时间+销毁时间>任务执行时间 就很不合算
- 创建很多线程需要很多内存。java对象占用堆内存,操作系统占用系统内存(栈内存),根据jvm规范,一个线程默认最大栈大小为1M,这个栈空间是需要从系统内存中分配的。
- 操作系统需要频繁的切换线程上下文,影响性能。
8、如何正常的使用多线程
- 多线程目的:充分利用cpu做事。
- 线程的本质:将代码送给cpu。
- 用合适数量的线程不断运送代码。
- 这个合适数量的线程就构成一个池。
- 要执行任务就放入池中,池中的一个线程将任务送给cpu执行。
9、如何确定合适数量的线程
如果是计算性任务:cpu的1~2倍
如果是IO型任务:则需要多一些线程,根据具体的IO阻塞时长进行考量决定。如tomcat中默认的最大线程池为:200.也可以考虑需要在一个最小数量和最大数量间自动增减线程数。
线程池原理
线程池工作原理
- 接收任务,放入任务仓库
- 工作线程从仓库取任务,执行
- 没有任务时线程阻塞,当有任务时唤醒线程执行。