java线程生命周期

2019-09-29  本文已影响0人  小李子

一、基础概念:

进程:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。

线程:线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。每一个线程有自己的寄存器和栈。

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

线程生命周期
上一篇下一篇

猜你喜欢

热点阅读