Java多线程基础

1.概念

1.1.进程

  1. 当一个程序被运行,就开启了一个进程, 比如启动了qq,word
  2. 程序由指令和数据组成,指令要运行,数据要加载,指令被cpu加载运行,数据被加载到内存,指令运行时可由cpu调度硬盘、网络等设备

1.2.线程

  1. 一个进程内可分为多个线程
  2. 一个线程就是一个指令流,cpu调度的最小单位,由cpu一条一条执行指令。并发:单核cpu运行多线程时,时间片进行很快的切换。线程轮流执行cpu。并行:多核cpu运行 多线程时,真正的在同一时刻运行。

多线程的好处:
程序运行的更快!快!快!
充分利用cpu资源,目前几乎没有线上的cpu是单核的,发挥多核cpu强大的能力。
多线程难点:
单线程只有一条执行线,过程容易理解,可以在大脑中清晰的勾勒出代码的执行流程
多线程却是多条线,而且一般多条线之间有交互,多条线之间需要通信,一般难点有以下几点

  1. 多线程的执行结果不确定,受到cpu调度的影响
  2. 多线程的安全问题
  3. 线程资源宝贵,依赖线程池操作线程,线程池的参数设置问题
  4. 多线程执行是动态的,同时的,难以追踪过程
  5. 多线程的底层是操作系统层面的,源码难度大

定义任务、创建运行线程
任务: 线程的执行体。也就是我们的核心代码逻辑
继承Thread类 (可以说是 将任务和线程合并在一起)
实现Runnable接口 (可以说是 将任务和线程分开了)
实现Callable接口 (利用FutureTask执行任务)
在这里插入图片描述
在这里插入图片描述
Thread实现任务的局限性

  • 任务逻辑写在Thread类的run方法中,有单继承的局限性
  • 创建多线程时,每个任务有成员变量时不共享,必须加static才能做到共享

Runnable和Callable解决了Thread的局限性

但是Runbale相比Callable有以下的局限性

  • 任务没有返回值
  • 任务无法抛异常给调用方

上下文切换
多核cpu下,多线程是并行工作的,如果线程数多,单个核又会并发的调度线程,运行时会有上下文切换的概念
cpu执行线程的任务时,会为线程分配时间片,以下几种情况会发生上下文切换

  • 线程的cpu时间片用完
  • 垃圾回收
  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

守护线程
默认情况下,java进程需要等待所有线程都运行结束,才会结束,有一种特殊线程叫守护线程,当所有的非守护线程都结束后,即使它没有执行完,也会强制结束。
默认的线程都是非守护线程。
垃圾回收线程就是典型的守护线程

一些概念需要了解,线程的阻塞可以分为好多种,从操作系统层面和java层面阻塞的定义可能不同,但是广义上使得线程阻塞的方式有下面几种

  1. BIO阻塞,即使用了阻塞式的io流
  2. sleep(long time) 让线程休眠进入阻塞状态
  3. a.join() 调用该方法的线程进入阻塞,等待a线程执行完恢复运行
  4. sychronized或ReentrantLock 造成线程未获得锁进入阻塞状态
  5. 获得锁之后调用wait()方法 也会让线程进入阻塞状态
  6. LockSupport.park() 让线程进入阻塞状态
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值