【Java】—— 多线程:随堂复习

目录

[1. 几个概念](#1. 几个概念)

[2. 如何创建多线程(重点)](#2. 如何创建多线程(重点))

[3. Thread类的常用方法、线程的生命周期](#3. Thread类的常用方法、线程的生命周期)

[4. 如何解决线程安全问题(重点、难点)](#4. 如何解决线程安全问题(重点、难点))

[5. 同步机制相关的问题](#5. 同步机制相关的问题)

[6. 线程间的通信](#6. 线程间的通信)


1. 几个概念

复制代码
程序(program):为完成特定任务,用某种语言编写的`一组指令的集合`。即指一段静态的代码。
​
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。
              进程作为操作系统调度和分配资源的最小单位。
​
线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。
             线程作为CPU调度和执行的最小单位
复制代码
线程调度策略
分时调度:所有线程`轮流使用` CPU 的使用权,并且平均分配每个线程占用 CPU 的时间。
​
抢占式调度:让`优先级高`的线程以`较大的概率`优先使用 CPU。如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
复制代码
> 单核CPU与多核CPU
> 并行与并发

2. 如何创建多线程(重点)

  • 方式1:继承Thread类

  • 方式2:实现Runnable接口

  • 方式3:实现Callable接口 (jdk5.0新增)

  • 方式4:使用线程池(jdk5.0新增)

3. Thread类的常用方法、线程的生命周期

复制代码
熟悉常用的构造器和方法:
1. 线程中的构造器
- public Thread() :分配一个新的线程对象。
- public Thread(String name) :分配一个指定名字的新的线程对象。
- public Thread(Runnable target) :指定创建线程的目标对象,它实现了Runnable接口中的run方法
- public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。
​
2.线程中的常用方法:
> start():①启动线程 ②调用线程的run()
> run():将线程要执行的操作,声明在run()中。
> currentThread():获取当前执行代码对应的线程
> getName(): 获取线程名
> setName(): 设置线程名
> sleep(long millis):静态方法,调用时,可以使得当前线程睡眠指定的毫秒数
> yield():静态方法,一旦执行此方法,就释放CPU的执行权
> join(): 在线程a中通过线程b调用join(),意味着线程a进入阻塞状态,直到线程b执行结束,线程a才结束阻塞状态,继续执行。
> isAlive():判断当前线程是否存活
​
3. 线程的优先级:
getPriority():获取线程的优先级
setPriority():设置线程的优先级。范围[1,10]
​
​
Thread类内部声明的三个常量:
- MAX_PRIORITY(10):最高优先级
- MIN _PRIORITY (1):最低优先级
- NORM_PRIORITY (5):普通优先级,默认情况下main线程具有普通优先级。

线程的生命周期:

jdk5.0之前:

jdk5.0及之后:Thread类中定义了一个内部类State

java 复制代码
public enum State {
        
        NEW,
    
        RUNNABLE,

        BLOCKED,

        WAITING,

        TIMED_WAITING,
 
        TERMINATED;
}

4. 如何解决线程安全问题(重点、难点)

  • 什么是线程的安全问题?多个线程操作共享数据,就有可能出现安全问题。

  • 如何解决线程的安全问题?有几种方式?

    • 同步机制:① 同步代码块 ② 同步方法

      • 重点关注两个事:共享数据及操作共享数据的代码;同步监视器(保证唯一性)
      复制代码
      在实现Runnable接口的方式中,同步监视器可以考虑使用:this。
      在继承Thread类的方式中,同步监视器要慎用this,可以考虑使用:当前类.class。
      复制代码
      非静态的同步方法,默认同步监视器是this
      静态的同步方法,默认同步监视器是当前类本身。
    • jdk5.0新增:Lock接口及其实现类。(保证多个线程共用同一个Lock的实例)

5. 同步机制相关的问题

  • 懒汉式的线程安全的写法

  • 同步机制会带来的问题:死锁

    • 死锁产生的条件及规避方式

6. 线程间的通信

  • 在同步机制下,考虑线程间的通信

  • wait() 、notify() 、notifyAll() 都需要使用在同步代码块或同步方法中。

  • 高频笔试题:wait() / sleep()

wait()sleep()是两个在多线程编程中常见的函数,它们用于控制线程的执行。

  1. wait():这是一个阻塞函数 ,它会挂起当前线程,直到其他线程调用notify()notifyAll()方法唤醒它。wait()通常用在同步块中,等待某个条件满足后再继续执行。

  2. sleep():这是一个非阻塞函数,它会暂停当前线程的执行一段时间,但不会释放锁。sleep()通常用在需要让出CPU时间片的场景,例如模拟耗时操作或者降低线程优先级。

这两个函数的主要区别在于是否释放锁。wait()会释放锁,允许其他线程获取锁并执行;而sleep()则不会释放锁,只是简单地暂停线程的执行。

相关推荐
k09337 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
激流丶14 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
神奇夜光杯15 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue17 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧19 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
测试界的酸菜鱼31 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
让学习成为一种生活方式34 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画40 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend1 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法