并发_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)_什么是基本类型包装器

c# 并发编程系列之一:线程进程线程池的基本概念

JUC并发编程 -- JUC介绍 & 线程/进程 & 并发/并行 & Java代码查看CPU的核数

Java千百问_09基础类库(003)_java.math包有什么功能

01_认识进程和线程

并发编程003 --- 线程的取消与关闭