一、基础概念:
进程:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
线程:线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。每一个线程有自己的寄存器和栈。
cpu核心树和线程的关系:1:1 或1:2(超线程)
cpu时间片轮转机制:
并发编程的利弊:
好处:充分利用cpu的资源,加快用户响应时间,程序模块化和异步化;
弊端:线程安全问题、死锁、线程快速切换很容易将cpu拖垮;
二、线程状态
1)NEW : 创建一个新的线程(Thread类、Runnable、Callable),注释:获取线程名称Thread.currentThread().getName();
2)RUNNABLE:就绪,线程创建后,线程.start();线程变为RUNABLE就绪状态,等待资源调度处理(需要被分配一个cpu时间片),如果时间片被使用完了,则也会返回RUNNABLE状态。如果使用yield()方法,则放弃当前已经得到的cpu使用权,但是当下次获得cpu使用权时,还是会RUNNING状态
3)RUNNING:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
4)TERMINATE/DEAD:线程终结状态(runing执行完成、exception都会进入终结状态)
5)BLOCK:阻塞状态。sleep/join/等待用户输入-都可以使线程进入阻塞状态。在阻塞时间结束后,线程进入RUNNABLE状态。
6)WAITING:等待状态。在线程调用wait时进入等待状态,线程进入等待队列,直到被唤醒。
注释:synchronized锁池队列(未取到锁的线程进入BLOCK状态,等待锁被解开,回到RUNNABLE状态继续等待cpu分配时间片)。
三、sleep、wait、join和io的区别
wait:在synchronized获取锁后,调用wait()/wait(timeout)函数,线程进入WAITING状态,进入等待队列并且释放锁,释放cpu,等待notify()/notifyAll()被唤醒,让线程进入锁池队列。
sleep:释放cpu,不释放锁。调用sleep()后,进入TIMED_WAITING阻塞状态,sleep时间结束后,线程进入RUNNING状态。
join:可以主线程进入TIMED_WAITING阻塞,让join的线程先执行完了,主程序再继续进入RUNNABLE状态。
四、补充知识
interrupt:停止线程信号。isInterrupted()后可以捕获InterruptedException异常,我们可以在捕获异常时关闭整个线程。
线程优先级:setPriority(0-10)//5 cpu时间片
守护线程:setDaemon(true),守护线程守护创建线程的线程(通常是主线程,并发框架中十分常见),在被守护线程结束时,守护线程自动终结。
附参考图片地址:https://www.cnblogs.com/hejing-swust/p/8038263.html