线程的实现方式,四线程和八线程的区别介绍 - 全文

天天见闻 天天见闻 2022-09-16 科技 阅读: 175
摘要: 四线程和八线程是线程的两种表现形式,下面来看看它们之间的区别以及线程的实现方式。线程的实现方式Java中有两种实现多线程的方式。那么这两种实现多线程的方式在应用上有什么区别呢?编写简单,run()方法的当前对象就是线程对象,可直接操作。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。

摘要:线程是程序执行流的最小单元。四线程和八线程是线程的两种表现形式,下面来看看它们之间的区别以及线程的实现方式。

线程介绍

线程,有时被称为轻量级进程( ,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程适用范围

1.服务器中的文件管理或通信控制

2.前后台处理

3.异步处理

线程特点

在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。

1)轻型实体

线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。

线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB( Block)描述。TCB包括以下信息:

1)线程状态。

(2)当线程不运行时,被保存的现场资源。

(3)一组执行堆栈。

(4)存放每个线程的局部变量主存区。

(5)访问同一个进程中的主存和其它资源。

用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。

2)独立调度和分派的基本单位。

在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。

3)可并发执行。

在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

4)共享进程资源。

在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

线程的实现方式

Java中有两种实现多线程的方式。一是直接继承类,二是实现接口。那么这两种实现多线程的方式在应用上有什么区别呢?

第一种方式:使用接口创建线程

1.可以将CPU,代码和数据分开,形成清晰的模型

2.线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法

3.有利于保持程序的设计风格一致

第二种方式:直接继承类创建对象

1.子类无法再从其它类继承(java语言单继承)。

2.编写简单,run()方法的当前对象就是线程对象,可直接操作。

在实际应用中,几乎都采取第一种方式

我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示。

我们首先这样编写这个程序:

Java代码 class {

int = 100;

void run(){

while(true){

if( 》 0){

.out.(.().() +

“is ” + --);

}else{

break;

}

}

}

}

main测试类:

Java代码 class {

void main([] args){

t = new ();

t.start();

t.start();

t.start();

t.start();

}

}

上面的代码中,我们用类模拟售票处的售票过程,run方法中的每一次循环都将总票数减1,模拟卖出一张车票线程,同时该车票号打印出来,直接剩余的票数到零为止。在类的main方法中,我们创建了一个线程对象,并重复启动四次,希望通过这种方式产生四个线程。从运行的结果来看我们发现其实只有一个线程在运行,这个结果告诉我们:一个线程对象只能启动一个线程,无论你调用多少遍start()方法,结果只有一个线程。

我们接着修改,在main方法中创建四个对象:

Java代码 class {

void main([] args){

new ().start();

new ().start();

new ().start();

new ().start();

}

}

Java代码 class {

int = 100;

void run(){

while(true){

if( 》 0){

.out.(.().() +

“ is ” + --);

}else{

break;

}

}

}

}

从结果上看每个票号都被打印了四次,即四个线程各自卖各自的100张票,而不去卖共同的100张票。这种情况是怎么造成的呢?我们需要的是,多个线程去处理同一个资源,一个资源只能对应一个对象,在上面的程序中,我们创建了四个对象,就等于创建了四个资源,每个资源都有100张票,每个线程都在独自处理各自的资源。

经过这些实验和分析,可以总结出,要实现这个铁路售票程序,我们只能创建一个资源对象,但要创建多个线程去处理同一个资源对象,并且每个线程上所运行的是相同的程序代码。在回顾一下使用接口编写多线程的过程。

Java代码 class {

void main([] args){

t = new ();

new (t).start();

new (t).start();

new (t).start();

new (t).start();

}

}

Java代码 class {

int = 100;

void run(){

while(true){

if( 》 0){

.out.(.().() +

“ is ” + --);

}

}

}

}

上面的程序中,创建了四个线程,每个线程调用的是同一个对象中的run()方法线程,访问的是同一个对象中的变量()的实例,这个程序满足了我们的需求。在上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。

可见,实现接口相对于继承类来说,有如下显著的好处:

(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承类的方式,那么,这个类就只能采用实现接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了接口的类的实例。

四核四线程和四核八线程的区别

4核4线就是说CPU有4个物理核心,所以任务管理器里就显示出4张CPU图表。

八线程,可以有2种情况, 物理4核和物理8核。

8核8线和前面4核4线一样,4核8线 就是说,使用了超线程技术,把一个物理核心,模拟成 2个逻辑核心,所以任务管理器会显示出8张CPU表。

超线程技术让(P4)处理器增加5%的裸晶面积,就可以换来15%~30%的效能提升。但实际上,在某些程式或未对多线程编译的程式而言,超线程反而会降低效能。除此之外,超线程技术亦要操作系统的配合,普通支持多处理器技术的系统亦未必能充分发挥该技术。例如 2000,英特尔并不鼓励使用者在此系统中利用超线程。原先不支持多核心的 XP Home 却支持超线程技术。

其他相关

电脑配置推荐高性价比 电脑配置推荐

作者: 天天见闻 时间:2024-03-21 阅读: 31
最新的电脑配置推荐配置推荐:CPU:12代酷睿i5- 12400F散热:利民AX120主板:微星B660M-B内存:金士顿 -野兽-3200-16G固态:金士顿nv2 500G M.2一299显卡:影驰 GTX 1660S电源:影驰500W机箱:玩嘉 流光 合计:4300左右CPU:12代酷睿i5 -12400……...
常用语言的线程模型(Java、go、C++、python3) | 京东云技术团队

常用语言的线程模型(Java、go、C++、python3) | 京东云技术团队

作者: 天天见闻 时间:2023-10-17 阅读: 57
背景知识软件如何驱动硬件?硬件需要相关的驱动程序才能运行,驱动程序安装在操作系统内核中。编写一个程序A后,A程序要操作硬件操作,首先需要进行系统调用,然后内核寻找相应的驱动程序来驱动硬件。驱动程序如何运行硬件?驱动程序作为硬件和操作系统之间的媒介,可以将与操作系统相关的命令翻译成硬件能够识别的电信号,同时,驱动程序还可以将硬件电信号转换为操作系统可以识别的命令。进程、轻量级进程、线程关系由于一个进程执行的空间不同,它被分为内核线程和用户进程,所有这些都称为内核线程,因为它没有虚拟地址空间。当创建一个新的用户进程时,分配一个新的虚拟地址空间,其中不同用户进程之间的资源被分离。创建新流程需要耗费大量资源,而且流程之间切换的成本也很高,因此引入了轻型流程。轻量化在本质上也是对内核线程的上层是抽象的,可以在不同的轻量级进程之间共享一些资源,但是由于轻量级进程本质上是内核线程,所以进行轻量级线程之间的切换需要进行系统调用,成本也很昂贵。内核本质上只能感知进程的存在,就像不同语言的多线程技术一样,是基于用户进程创建的线程库,线程本身不是参与处理器竞争,而是其所属的用户进程参与处理器的竞争。<!--autointro-->...
Java培训:Java 20中的新特性

Java培训:Java 20中的新特性

作者: 天天见闻 时间:2023-10-08 阅读: 69
Java20版本正式指定了七个关键特性,包括虚拟线程、矢量API建议、结构化并发、作用阈值、外部函数和内存API、记录模式以及switch语句和表达式的模式匹配。想要学习Java技术的学生,可以参加Java训练,考虑全面系统的理论知识和实操项目的学习,以便你快速学习。 1。虚拟线程 虚拟线程是结构化并发的先决条件,自JDK19首次预览以来,已经进行了一些修改。这些更改包括API的一些调整以及ThreadGroup的持久性退化。当它们进入第二预览阶段时,这些轻量级线程旨在简化具有高吞吐量要求的同时应用程序的开发和维护。Oracle相信,这种扩展将带来Java应用程序扩展方式的重大变化。自JDK 19初始预览版以来的更新涉及少量API更改(目前在JDK 19中是持久的)和ThreadGroup降级(现在在JDK 19中也是持久的)。...
Java面试:Java 内存分配与回收策略及Java死锁

Java面试:Java 内存分配与回收策略及Java死锁

作者: 天天见闻 时间:2023-10-05 阅读: 62
概述java内存分配和回收策略以及Minor GC和Major GC(Full GC)。 内存分配 堆栈区域:堆栈分为java虚拟堆栈和本地方法堆栈。 堆空间:堆由所有线程共享,在虚拟机启动时创建并唯一存储对象实例。堆区域是gc的主要区域,通常分为两个块年轻一代和老龄一代。更细的年轻一代分为Eden领域,主要放置新建对象,From survivor和To survivor保存gc幸运保存的对象,默认情况下分别占8:1:1。...
什么是线程?

什么是线程?

作者: 天天见闻 时间:2023-09-26 阅读: 69
帖子是什么?线程是操作系统能够进行运算调度的最小单位,也称为轻量级进程,是进程的执行单位。在多任务处理中,线程是用户进程的一个例子,它包含一组独立的执行单元,这些执行单元称为线程。每个线程都有自己的堆栈、堆栈以及执行上下文,彼此通过共享内存进行通信。线程可以分为单线程、多线程、线程池等不同类型。单线程意味着程序只有一条执行线…...
AMD新一代线程撕裂者再展锋芒:96核心192线程

AMD新一代线程撕裂者再展锋芒:96核心192线程

作者: 天天见闻 时间:2023-07-14 阅读: 84
AMD在高端发烧友领域独占鳌头,其锐龙线程裂裂者系列无法压制Intel,Zen3架构破裂者5000系列已经拥有64核128线程、8通道DDR4和128条PCIe 4.0,而Intel在核心和性能上略逊色;AMD在第三季度发布了Zen4架构的线程撕裂者7000系列,AMD官方的OPN产品清单已经表明,下一代线程撕裂者的顶级型号至少有两种。...
我来说两句

年度爆文