专栏首页happyJared多线程系列问题汇总

多线程系列问题汇总

  1. 什么是上下文切换?

多线程编程中,一般线程的个数都大于 CPU 的核心个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,通常 CPU 采取的策略是:为每个线程分配时间片 + 轮转的形式。当线程的时间片用完时,CPU 就会重新处于就绪状态,并让其他线程使用,这整个过程就属于一次上下文切换。

当前任务在执行完 CPU 时间片并切换到另一个任务之前,会先保存自己的状态,以便下一次再切换回这个任务时,可以再次加载这个任务的状态。任务从保存到再加载的过程,就是一次上下文切换。

Linux 相比于其他操作系统(包括类 Unix 系统)有很多的优势,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。

  1. 说说 Thread.sleep() 方法和 Object.wait() 方法的区别和共同点?
  • 区别点:sleep() 方法没有释放锁,而 wait() 方法释放了锁;
  • 共同点:两者都是暂停线程的执行;wait() 通常用于线程间的交互/通信,sleep() 通常被用于暂停方法的执行;
  • wait() 方法调用后,线程不会自动苏醒,需要别的线程触发调用同个对象上的 notify() 或者 notifyAll() 方法来唤醒(但也不一定保证成功),或者使用 wait(long timeout) 方法,超时后线程会自动苏醒。sleep() 方法执行完后,线程会自动苏醒。

Object.wait()

Object.wait(long timeout)

Thread.sleep()

Thread.start()

可以观察到,最终执行的都是 native 方法

  1. 为什么调用 Thread.start() 方法时会执行 run() 方法,为什么不能直接调用 run() 方法?

new Thread() 后,线程进入新建状态;调用 start() 方法,相当于启动线程并使线程进入就绪状态,从操作系统分配到时间片后,线程才开始正式运行。start() 会执行线程的相应准备工作,然后自动执行 run() 方法中内容,这是真正的多线程工作;而直接执行 run() 方法,会把 run() 方法当成 main 线程下的普通方法来执行,并不会另起个线程来执行,因此这并不是多线程工作方式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线程池

    如果要让线程池执行任务,需要实现的 Runnable 接口或 Callable 接口。Runnable 接口或 Callable 接口的实现类都可以被 Thre...

    happyJared
  • AQS

    AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。

    happyJared
  • 什么是线程和进程

    进程是程序的一次执行过程,是系统运行程序的基本单位,进程是动态的,系统每运行一个程序,即是一个进程从创建、运行到消亡的过程。

    happyJared
  • Java线程与内存模型

    cwl_java
  • 高级java必须清楚的概念:原子性、可见性、有序性

    原子性、可见性、有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。 原子性 原子性是指一个线程的操作是...

    Java技术栈
  • 并发编程之Java内存模型

    JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。 JMM体现在以下几个方...

    海仔
  • java面试必备之ThreadLocal

    按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低...

    JKXQJ
  • O1-开源框架使用之EventBus

    说明使用POSTING,发布与订阅在同一个线程,也就是子线程,更新UI会崩 说明使用MAIN,不管发布者在哪,订阅者都在main线程,可更新UI,但不能耗时操...

    张风捷特烈
  • 谈谈java的ThreadLocal

    简单介绍 ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过Thread...

    Spark学习技巧
  • RxJava从入门到不离不弃(五)——Scheduler线程调度

    在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程...

    蜻蜓队长

扫码关注云+社区

领取腾讯云代金券