并发编程-线程基础

基础概念:

  1. 进程与线程

进程是操作系统分配资源的基本单位,进程是cpu调度的基本单位。
同一进程下的线程共享进程中的一些资源,线程也有自己独立的存储空间。

  1. 多线程

多线程是指的,再单个的进程中同时存在多个线程
存在多个线程,可以类比再一家店里同时存在多个伙计,分别负责不同的职责。让服务可以更加快捷和丝滑
但是引入多线程,多个线程同时管理同一份资源,会带来一致性的问题。这和单体架构过度道分布式架构出现的问题很类似。

  1. 串行、并行、并发

串行:同一个cpu,按照顺序执行代码。排队执行
并行:多核cpu,同时执行多个程序片段
并发:单核cpu再多个程序之间快速切换(和高并发不是一个意思)

  1. 同步和异步,阻塞和非阻塞

同步和异步,执行程序后被调用者是否会主动反馈信息
阻塞和非阻塞,执行某个功能后,调用者是否需要一直等待结果反馈

创建线程的方式

  1. 继承Thread类,重写run方法
  2. 实现Runnabble接口,重新run方法【可以用匿名内部类,或lambda方式】,因为new Thread的构造可以接收一个Runnable实例,
  3. 实现Callable接口,重写call方法,配合FutureTask【获取返回值】,因为new Thread的构造可以接收一个FutureTask实例,而FutureTask(Future Task)则需要一个Callable实例。
    所有的创建方式,最终都是要实现一个Runnable接口。

线程的状态

  1. 操作系统层面的5种状态:new-ready-running-terminated,在running过程中可以通过方法调用,让线程处于waiting状态
  2. java中的线程的6种状态:new-runnable(reday+running)-Terminated,在runnable状态下,可以调用wait()让线程进入waiting状态,调用sleep()或join()让程序进入timed_waiting状态,synchronized没有拿到锁的时候进入blocked状态

当一个线程被new出来之后,没有调用start()方法,则该线程是new状态
当一个线程在运行过程中,则该线程是runnable状态
当一个线程没有拿到锁的时候,线程的状态是blocked状态
当线程主动调用wait方法时,线程进入waiting状态
当线程调用sleep(),或join()方法时,sleep必须带参数,join可以不带参数(直接timed_waitting到调用线程结束),线程进入timed_waiting状态
当线程结束后,查看状态的状态,此时为terminated状态

线程api

方法
staticThread currentThread() 获取当前线程
StringgetName() 获取当前线程的名称,用来标识和排错.
static voidyield() 让当前线程从运行状态转变为就绪状态.
static voidsleep(long millis)让线程休眠
static voidsleep(long millis)让线程休眠
voidjoin() 让线程先执行一段时间或到结束,取决于是否带参数
voidsetDaemon(boolean on) 标记线程为守护线程,JVM推出前会保证所有非守护线程结束
voidnotify(),notifyAll() 需要使用锁对象去唤醒

线程中存在等待池和锁池,等待池中的线程处于等待唤醒,或自己醒的状态,锁池的线程则是在等待锁释放,释放后抢锁执行程序。

  • 线程结束

Interrput方法
isInterrupted() 查看interrut标记,默认interrupt为false
interrupt() 打断线程状态
interrupted() 返回interrupt状态,并归位为false

打断waitingtimed_waiting状态从而对线程的状态进行控制,执行不同的代码块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默的游鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值