笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

线程

Posted on 2025-05-26 15:14  草妖  阅读(4)  评论(0)    收藏  举报
创建普通对象和线程的区别:(详情请跳转(更加详细,本文仅作笔记摘抄):Java并发常见面试题总结 | Java学习&面试指南-程序员大彬 (topjavaer.cn))

  new Object()过程如下:

    1、JVM分配一块内存 M;2、在内存 M 上初始化该对象;3、将内存 M 的地址赋值给引用变量 obj

  创建线程的过程如下:

  1. JVM为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧;
  2. 每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量池组成;
  3. 每个线程获得一个程序计数器,用于记录当前虚拟机正在执行的线程指令地址;
  4. 系统创建一个与Java线程对应的本机线程;
  5. 将与线程相关的描述符添加到JVM内部数据结构中。
  6. 线程共享堆和方法区域;

  创建一个线程大概需要1M左右的空间(Java8,机器规格2c8G)。可见,频繁手动创建/销毁线程的代价是非常大的。

线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。
轻量级进程(LWP)不是线程的实现方式,而是操作系统内核用来支持线程运行的一种机制
三种线程实现方式:
1.用户级线程(ULT): -线程的创建、调度和管理都由用户程序完成。 -操作系统对线程一无所知。 -优点是切换开销小,缺点是无法利用多处理器。 2.内核级线程(KLT): -线程的创建、调度和管理都由内核完成。 -操作系统直接对线程进行调度。 -优点是可以利用多处理器,缺点是系统调用开销大。 3.混合线程: -结合了ULT和KLT的优点。 -用户级线程与内核级线程进行多对多映射。 -既保证了系统调用的效率,又可以充分利用多处理器。
轻量级进程(LWP)是操作系统提供的一种支持机制,它是内核线程的高度抽象,是用户程序利用线程库创建线程时在内核中的实体。因此,它不属于线程的实现方式,而是实现线程的一种技术手段。

 

 
 

笔记参照:一张图搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!-腾讯云开发者社区-腾讯云

 

Thread.sleep(100);  // 将当前现场暂停,但是不进行释放锁。
Thread tempThread=new Thread(()->{});
tempThread.wait();  // 让持有对象锁的线程释放锁,进入线程等待池中等待被再次唤醒(notify随机唤醒,notifyAll全部唤醒,线程结束自动唤醒)即放入锁池中竞争同步锁,同时释放CPU资源,它的调用必须在同步方法或同步代码块中执行,也需要捕获 InterruptedException 异常。
tempThread.join();  // 调用join的线程拥有优先使用CPU时间片的权利,其他线程需要等待join()调用线程执行结束后才能继续执行,探索其底层会发现,它的底层是通过wait()进行实现,因此它也需要处理异常。
Thread.yield();  // 仅让出CPU时间片,不会释放锁。只会给相同优先级或更高优先级的线程运行的机会,并且调用yield的线程状态会转为就绪状态,调用yield方法只是一个建议,告诉线程调度器我的工作已经做的差不多了,可以让别的线程使用CPU了,没有任何机制保证采纳。所以可能它刚让出CPU时间片,又被线程调度器分配了一个时间片继续执行了。使用时不需要处理异常。

 

AddBy 2025-08-04

start()与run()

在Java中,Thread类的start()方法和run()方法的核心区别在于:

start()方法

  1、‌启动新线程‌:调用start()会创建新线程,并将线程状态改为“就绪”(RUNNABLE),等待操作系统调度执行。此时JVM会自动调用run()方法,通过新线程执行任务,实现并发。

  2、线程生命周期管理‌:调用start()后,线程状态从NEW变为RUNNABLE,等待CPU调度;若run()执行完毕,线程终止。

run()方法

  1、‌单线程执行‌:直接调用run()仅在当前线程(如主线程)中顺序执行代码,不会创建新线程。

  2、线程状态不变‌:若未启动线程(未调用start()),线程状态仍为NEW,调用run()不会改变状态。

关键差异 ‌

  1、并发性‌:start()支持多线程并发执行,run()仅支持单线程顺序执行。

  2、资源分配‌:start()会分配新线程资源(如栈空间),run()在原线程中执行,不涉及新资源分配。

 EndBy 2025-08-04