@@ -206,3 +206,43 @@ volatile的三重功效:64位写⼊的原⼦性、内存可⻅性和禁⽌重
206206volatile 关键字只保证了对变量的读写操作的可见性和顺序性,并不保证原子性。如果需要保证原子性,可以考虑使用其他同步机制,如锁或原子类
207207
208208[ 面试官:Java线程与底层操作系统线程是一 一对应的吗? 中篇[ 一] _ mob60475706bec5的技术博客_51CTO博客] ( https://blog.51cto.com/u_15127698/2842977 )
209+
210+ ## 1.什么是线程?
211+ 线程是Java语言提供的多线程机制,用于实现并发执行的程序单元。Java线程是有JVM创建和管理的,通过Thread类来操作线程。底层通过操作系统的线程的支持来实现线程创建、切换和调度的。Java也提供了自己的线程调度器(Thread Scheduler)决定线程在那个时间点上执行,以及他们的优先级、时间片等调度策略。
212+ Jvm可能一些技术优化线程的创建和管理,如线程池和线程重用技术,与操作系统的线程可能是多对一。
213+ ## 2.什么是线程池?
214+ 线程池是一种并发编程技术,通过创建一组线程并管理他们的生命周期,以提供线程的重用和有效的调度。线程池技术可以优化线程的创建和销毁开销,提供系统性能和资源利用率。
215+ 线程池包含以下条件:
216+ 线程队列(Thread Queue):用于存储待执行的任务。当任务到达时会从线程池中获取任务。
217+ 工作线程(Worker Thread):线程池中预先创建的线程。他们负责从线程池中获取一组任务。
218+ 任务接口(Task Interface):定义了要执行任务的抽象类或接口。任务可以是各种形式的单元,例如Runnable或Callable
219+ 线程池管理器(ThreadPool Manager):负责创建和管理线程,包括线程的创建、调度和销毁
220+ 线程池的工作原理:
221+ ** 初始化线程池** :在启动应用程序时,线程池会预先创建一定数量的工作线程,并将它们保存在线程池中。
222+ ** 提交任务** :当有任务需要执行时,应用程序可以将任务提交给线程池。任务会被放入线程队列中等待执行。
223+ ** 任务调度** :线程池管理器会从线程队列中获取待执行的任务,并分配给空闲的工作线程执行。
224+ ** 执行任务** :工作线程执行任务,并在任务完成后返回线程池,准备执行下一个任务。
225+ ** 线程重用** :一旦任务执行完毕,工作线程并不会立即销毁,而是继续保持在线程池中,可以被复用来执行其他任务。初始化线程池:在启动应用程序时,线程池会预先创建一定数量的工作线程,并将它们保存在线程池中。
226+ Java中的Executor框架提供了丰富的线程池实现,包括ThreadPoolExecutor和ScheduledThreadPoolExecutor等,使得线程池的使用变得更加方便和灵活。
227+
228+ ## 3.线程的创建和销毁需要准备什么?
229+ 线程的创建和销毁过程会对系统产生一定的性能损耗,主要体现在以下几个方面:
230+
231+ ** 上下文切换开销** :线程的创建和销毁涉及到上下文切换的过程。当一个线程被创建时,需要分配和初始化线程的数据结构、栈空间等资源,并将控制权从父线程切换到新创建的子线程。同样,线程的销毁也需要进行上下文切换,将控制权返回给父线程。这些上下文切换操作会引入一定的开销,包括寄存器状态的保存和恢复、内核态与用户态之间的切换等。
232+
233+ ** 资源消耗** :每个线程都需要占用一定的系统资源,包括内存、** 栈空间** 、线程控制块等。线程的创建会增加系统的资源消耗,而线程的销毁则会释放这些资源。如果频繁地创建和销毁线程,会导致系统资源的频繁分配和回收,增加了系统的开销。
234+
235+ ** 线程同步与通信开销** :在多线程环境下,线程之间可能需要进行同步和通信,以确保数据的一致性和正确性。线程的创建和销毁可能会引入额外的同步和通信开销,例如等待新线程的创建完成、资源的初始化、线程间的通知和等待等操作。这些开销会增加系统的负担,并且在复杂的线程同步场景中可能导致性能下降。
236+
237+ ** 系统调度开销** :线程的创建和销毁会对系统的调度产生影响。当线程被创建时,系统需要为新线程分配CPU时间片,并进行调度。而线程的销毁会使系统重新调整现有线程的调度优先级和顺序。这些调度开销会增加系统的开销,特别是在线程频繁创建和销毁的情况下。
238+
239+ 在线程创建时,需要准备一些上下文信息,以确保线程能够正确执行。这些上下文信息包括:
240+ 线程函数/入口点:创建线程时需要指定线程函数或线程的入口点。线程函数是线程执行的起始点,线程将从该函数开始执行任务。
241+ 栈空间:每个线程都需要有自己的栈空间,用于存储局部变量、函数调用信息以及其他线程执行所需的上下文数据。在线程创建时,需要分配一定大小的栈空间。
242+ 线程参数:如果线程函数需要接受参数,那么在线程创建时需要将参数传递给线程函数。这些参数可以是数值、指针或其他数据类型,用于传递线程所需的初始化数据。
243+ 线程标识:为了能够在程序中唯一标识和管理线程,创建线程时通常会分配一个唯一的线程标识,以便后续对线程进行操作和管理。
244+ 线程状态信息:线程的状态信息用于记录线程的运行状态,例如就绪、运行、阻塞等。在线程创建时,需要对线程的状态进行初始化,通常将线程初始状态设置为就绪状态,以便系统进行调度。
245+ CPU寄存器状态:在创建线程时,需要保存当前线程创建时的CPU寄存器状态,以便在线程切换时能够正确地恢复线程的执行状态。
246+ 调度优先级:线程的调度优先级决定了它在系统中获得CPU时间片的优先级。在线程创建时,可以设置线程的调度优先级,以控制线程的调度行为。
247+
248+ 以上是一些常见的线程创建时需要准备的上下文信息,具体的上下文数据可能会因操作系统和编程语言的不同而有所差异。这些上下文信息的准备是为了确保线程能够正确地执行任务,并与其他线程协同工作。
0 commit comments