并发_003 线程基本介绍
Posted hpzhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发_003 线程基本介绍相关的知识,希望对你有一定的参考价值。
目录
- 线程的优势
- 线程的风险
- JAVA中线程创建方式
- 线程的调度
- 线程的状态
线程的优势
1 发挥多处理器的强大能力(CPU基本调度单位是线程,如果在单核下,使用多线程可以提高吞吐量,多核下,使用多线程能更高的利用CPU资源)
2 建模的简单性
3 异步事件的简化处理
4 响应更灵敏的用户界面
线程的风险
1 安全性(永远不发生糟糕的事情)问题 多个线程的操作执行顺序是不可预测的,甚至会产生奇怪的结果(导致原因:CPU,缓存行,内存)
2 活跃性(某件正确的事情最终会发生)问题
2.1 死锁 两个或两个以上线程在执行过程中,由于竞争资源或者由于批次通信而造成的一种阻塞的详细,若无外力作用,它们将无法推进下去(例如:两辆车在一条马路上互不想让)
2.2 活锁 任务或者执行没有被阻塞,由于某些条件没有满足,导致一直重复尝试-失败-尝试-失败的过程(例如:两辆车在一条那路上相互谦让,你让我走,我让你走,一直谦让)
2.3 饥饿 如果一个线程因为CPU时间全部被其它线程抢走而得不到CPU运行时间,这种状态被称为"饥饿"(例如:过马路,别人总是抢在我前面走,导致我一直过不了)
3 性能(正确的事情尽快发生)问题(主要是线程的开销)
3.1 上下文切换 CPU通过时间片的分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务,在切换前会保存上一个任务的状态,以便下次切换这个任务
JAVA中线程的创建方式
1 创建Tread的自雷
2 实现Runnable的接口
3 使用ExecutorService,Callable,Future实现有返回结果的多线程nable接口
线程的调度
1 抢占式调度 每条线程执行的时间,线程的切换都由系统的控制(一个线程的堵塞不会导致整个进程的堵塞)
2 协同式调度 每一条线程执行完完后主动通知系统切换到另一条线程上执行(可能导致整个系统崩溃)
线程的状态
新建状态(New) 线程对象被创建后,就进入了新建状态
就绪状态(Runnable) 线程对象被创建后,其它线程调用了该对象的start()方法,从而启动该线程
运行状态(Running) 线程获取CPU权限进行执行,线程只能从就绪状态进入到运行状态
阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行,知道线程进入就绪状态,才有机会转到运行状态
等待阻塞 通过调用线程的wait()方法,让线程等待某工作的完成
同步阻塞 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态
其它阻塞 通过调用线程的sleep()或join()或发起IO请求时,线程会进入到阻塞状态,当sleep()状态超时,join()等待线程终止或者超时,或者IO处理完毕时,线程重新转入就绪状态
死亡状态(Dead)线程执行完了或者因异常退出了run()方法,该线程结束生命周期
以上是关于并发_003 线程基本介绍的主要内容,如果未能解决你的问题,请参考以下文章
Java千百问_06数据结构(003)_什么是基本类型包装器
JUC并发编程 -- JUC介绍 & 线程/进程 & 并发/并行 & Java代码查看CPU的核数