Java线程的实现

数字觅云使
• 阅读 2086

一个线程的启动是需要通过Thread.start()方法来完成的(也只有start才完成一个线程的真正创建,new Thread不算),这个方法会调用本地方法JNI来实现一个真正意义上的线程,或者说只有start成功调用后由OS分配线程资源,才能叫做线程,而在JVM中分配的Thread对象只是与只对应的外壳。

轻量级进程

线程为轻量级进程,多个线程共享一个进程资源,对于OS的许多资源的分配和管理(例如内存)通常都是进程级别的,线程只是OS调度的最小单位,线程相对进程更加轻量一些,它的上下文信息会更少,它的创建与销毁会更加简单,线程因为某种原因挂起后不会导致整个进程被挂起,一个进程中又可以分配许多的线程。但是某个线程占用过多资源会导致整个进程宕机。线程使用的是堆外内存空间。

启动线程

start方法怎么启动线程的:

(1)基于Kernel Thread(KLT)的映射来实现(Java采用此方案)

Java线程的实现

KLT是内核线程,内核线程由OS直接完成调度切换,它相对应用程序的线程来讲只是一个接口,外部程序会使用一种轻量级进程(Light Weight Process,LWP)来与KLT进行一对一的接口调用。也就是说,进程内部会尝试利用OS的内核线程去参与实际的调度,而自己使用API调用作为中间桥梁与自己的程序进行交互。

(2)基于用户线程(User Thread,UT)的实现

Java线程的实现

是否可以没有中间这一层映射,自己的线程直接由CPU来调度,或许理论上效率更高。不过这样实现时,用户进程需要关注的抽象层次会更低一些,跳过OS更加接近CPU,即自己要去做许多OS要做的事情,自然的OS的调度算法、创建、销毁、上下文切换、挂起等等都要自己要搞定(CPU只做计算),这样做显然很麻烦,有人尝试了,后来放弃了。

(3)混合实现方式

Java线程的实现

设计理念是既希望保留Kernel线程原有的架构,又想使用用户线程,轻量级进程依然与Kernel线程一一对应,唯一的变化就是轻量级进程不再与进程直接挂钩,而是与用户线程挂钩,用户线程不一定必须与轻量级进程一一对应,而是多对多,就像在使用一个轻量级进程列表一样,增加了一层来解除轻量级进程与原进程之间的耦合。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java 多线程
创建线程的4种方式1、继承Thread类,复写run方法,run方法中为线程需要执行的逻辑部分,而启动线程调用start方法。小示例见代码,通过Thread.currentThread().getName()可以获得当前线程名称publicclassMyThreadextendsThread{private
Wesley13 Wesley13
4年前
java多线程相关
Runnablerunnable是线程实现的一种方式(接口实现),它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable的实现运行多线程程序,Thread类在调用start()函数后就是执行的是runnable的run()函数。runnable的声明如下:publicinterfac
Wesley13 Wesley13
4年前
java 线程及线程池
说明:线程共包括以下5种状态。1. 新建状态(New):线程对象被创建后,就进入了新建状态。例如,ThreadthreadnewThread()。2. 就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread
灯灯灯灯 灯灯灯灯
4年前
阿里二面必备考题之Java并发!全面解析
一、使用线程有三种使用线程的方法:实现Runnable接口实现Callable接口继承Thread类实现Runnable和Callable接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过Thread来调用。可以理解为任务是通过线程驱动从而执行的。实现Runnable接口cpublicclass
Wesley13 Wesley13
4年前
Java线程的6种状态及切换(透彻讲解)
Java中线程的状态分为6种。1\.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2\.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的
Wesley13 Wesley13
4年前
Java的编程逻辑
1、run()和start()的区别2、线程的基本属性和方法1.id:一个递增的整数,每创建一个线程就加一2.name3.优先级:从1到10,默认为5,会映射到系统中的优先级。数字越大,要优先级越高4.状态: NEW:还没调用start RUNABLE:正在执行run或者正在等待cup分配
Wesley13 Wesley13
4年前
Java面试系列
实现多线程的方式继承Thread类,重写run方法,调用start方法启动线程实现Runnable接口,重写run方法,调用start方法启动线程实现Callable接口,重写call方法,并用FutureTask包装,在newThread中传入FutureTask,然后调用start方
Stella981 Stella981
4年前
CountDownLatch和CylicBarrier以及Semaphare你使用过吗
CountDownLatch是什么CountDownLatch的字面意思:倒计时门栓它的功能是:让一些线程阻塞直到另一些线程完成一系列操作后才唤醒。它通过调用await方法让线程进入阻塞状态等待倒计时0时唤醒。它通过线程调用countDown方法让倒计时中的计数器减去1,当计数器为0时,会唤醒哪些因为调用了await而阻塞的线程。
Wesley13 Wesley13
4年前
Java多线程
JavaThread状态NEW创建被创建,但是还没有开始的线程,也就是还没有调用start()方法。RUNNABLE运行就绪可运行状态,在JVM中执行,但是可能等待操作系统CPU资源。BLOCKED阻塞线程阻塞等
Wesley13 Wesley13
4年前
C# 线程基础
1 线程是进程中的一个执行流 2线程是一个可以单独操作的活动3线程创建和常用方法 a 创建    Thread thnewThread(Method); b常见方法 th.start()//启动线程 th.Abort()//终止线程 Thread.Sleep(n)//休眠线程(停止n毫秒后继续执
探索虚拟线程:原理与实现
虚拟线程的引入与优势在Loom项目之前,Java虚拟机(JVM)中的线程是通过java.lang.Thread类型来实现的,这些线程被称为平台线程。然而,平台线程的创建和维护在资源使用上存在显著的开销。首先,创建成本不菲,因为每当操作系统需要创建一个新的平