-
进程、线程
进程是系统资源分配的最小单位。
线程是cpu调度的最小单位,依附于进程;- 像计算机上的迅雷、微信、tomcat等,启动后,都是一个个进程,而进程里面可以有很多线程。
- tomcat启动后,最多可以有200个线程;
- linux系统下,一个进程最多有1024个线程;windows下,一个进程最多2000个线程。
- 一个2G内存的cpu,执行一条指令的时间大概在0.7ns左右,而线程上下文切换的话,在70ns~0.7us之间。
-
电脑内核和线程数
- 买电脑的时候内核多少说的是有个屋里cpu,比如8核,就有8个屋里cpu,一个cpu可以供一个线程使用。
- 超线程技术:随着时代发展,现在的一个cpu可以供2个线程使用,超越了一个线程,可以有2个逻辑cpu。
- 查询当前系统可用逻辑cpu数量:Runningtime.getRuntime.avaliableProcessors();
-
启动一个线程的方法
JDK源码写了总共有2种:- 基础Thread类。
- 实现Runnable接口。
Thread类是java原生的线程;
Runnable启动的线程是业务逻辑的封装和抽象出来的,Runnable要放到Thread类中启动一个线程;
Thread启动:
Thread thread = new Thread();
thread.start();
Runnable启动:
Thread thread = new Thread(new Runnable());
thread.start();
-
结束线程
中断某个线程,不要使用额外的参数来设置是否中断,要采用interrupt()方法。
- interrupt();
当前线程调用这个方法的时候,会将当前线程设置一个中断标志位,然后用isInterrupt()来读取线程的中断标志位。 - static的Interrupt()
同样会设置中断标志位为true,但是调用isInterrupted()后,会再将中断标志位设为false。
-
线程状态
yield():
线程调用该方法会主动放弃时间片,而处于就绪状态,会参与时间片下次的分配调度。concurrentHashMap中对某个segment扩容的时候,会调用yield方法,当多个线程来扩容的时候,保证只有一个线程去操作。
join():
一个线程等待另一个线程执行完毕后才继续执行的场景,可使用join方法。例如:A.join(B),只有B线程执行完毕后,A线程才会继续执行。
阻塞状态:
有且仅有调用Synchronized内置锁后线程才会阻塞。 -
run()/star()区别
run()方法可以理解为一个普通的方法,在当前线程调用,不会新启线程调用。
start()方法会向JVM申请一个新的线程来执行run()方法里的逻辑。 -
manamentFactory使用
可以使用该类来监控系统、JVM、堆栈信息等