美文网首页程序员
java多线程(一)多线程基础

java多线程(一)多线程基础

作者: 7ColorLotus | 来源:发表于2020-05-20 22:55 被阅读0次
  • 进程和线程
    1. 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
    2. 线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
  • 并行和并发
    1. 并行是在同一时刻同时执行
    2. 并发是在一个时间段内执行
  • 开启线程的方法
    1. 继承Thread类
    2. 实现Runnable接口
    3. 实现Callable接口,有返回值。需要借助FutureTask类,该类实现了Runnable接口
  • 中断线程的方法:
    1. stop(),suspend()方法尽量不要用,stop方法太过激进调用直接终止线程,suspend()方法挂起线程后不释放资源。尽量使用下面的方法
    2. interrupt()方法,中断线程,并不强行关闭线程。该方法有线程对象决定是否停止。中断标志位置为true
    3. isInterrupt()方法终止线程,并返回是否已经终止,判断中断标志位置是否为true
    4. static方法interrupted()中断标志改为false
    5. 方法会抛出InterruptedException,线程的中断标志位会被复位成false,这时需要在catch里调用interrupt()方法将中断标志设置为true
  • 线程的状态
    1. 新建
    2. 就绪
    3. 运行
    4. 阻塞
    5. 死亡
线程状态运行图.png
  • java线程中的方法
    1. start():将线程由新建状态转入就绪状态
    2. join():获取执行权,由就绪状态转为运行状态
    3. yield():运行状态转为就绪状态,当前线程时间片到期,等待下次一次时间片
    4. run(),stop(),setDeamon()线程运行结束进入死亡状态
    5. wait():线程由运行状态进入阻塞状态,等待notify()或者notifyAll()唤醒后进入就绪状态
    6. sleep():线程由运行状态进入阻塞状态,等待sleep时间到或者interrupt()后进入就绪状态
  • 线程的优先级
    1. 1-10,缺省为5,值越高分配的时间片越大
    2. 不同的操作系统对优先级的作用不同,有的操作系统会忽略优先级,所以线程优先级不可靠
  • 守护线程
    1. 和主线程共死的,主线程退出,守护线程也会退出
    2. 设置成守护线程setDaemon(true),必须在start方法前使用
    3. 守护线程中的finally不能保证一定会执行
  • 线程间的共享
    1. Synchronized内置锁都是锁对象
      a)对象锁:动态方法上
      b)类锁 :每个类的class对象
    2. volatile关键字,最轻量的同步机制,最适用只有一个线程写,多个线程读的场景,只能确保可见性。像整型数自加等操作不能确保其原子性
    3. ThreadLocal关键字。每个线程只能使用自己线程的拷贝。尽量存储一个占用内存比较小的数据结构,否则比较耗内存。比如Integer。
  • 线程间的协作
    1. wait
    2. notify和notifyAll
    3. 等待方的标准范式:
      a, 获取对象的锁
      b, 判断循环条件是否满足,不满足调用wait方法
    4. 通知方的标准范式:
      a, 获取对象的锁
      b, 改变条件
      c, 通知所有等待对象的锁
    5. 尽量使用notifyAll,因为使用notify可能会发生信号丢失,使用notify可能会解锁对象的某一个线程锁,不能解锁对象的其他线程锁,当出现有多个线程对对象使用wait()时,会出现有线程的锁无法解开
    6. 等待超时模式实现一个连接池
  • join()方法
    1. 可以解决多个线程按顺序执行
    2. 线程A执行了线程B的join方法,线程A必须等待线程B执行完后才能继续执行
  • 调用yield(),sleep(),wait(),notify等方法对锁有何影响
    1. 调用yield()以后,持有的锁不释放
    2. 调用sleep()以后,持有的锁不释放
    3. 调用wait()方法之前必须持有锁,调用方法后,锁会被释放;当wait()方法返回的时候,当前线程重新持有锁
    4. 调用notify()或notifyAll()方法之前必须持有锁,调用notify()或notifyAll()方法本身不会释放锁。等当前锁模块执行完后才释放锁

相关文章

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • Java多线程学习(三)——synchronized(上)

    在前两节的《Java多线程学习(一)——多线程基础》和《Java多线程学习(二)——Thread类的方法介绍》中我...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

网友评论

    本文标题:java多线程(一)多线程基础

    本文链接:https://www.haomeiwen.com/subject/etnoohtx.html