线程是什么意思(电脑cpu的核心与线程是什么意思)
本文目录
电脑cpu的核心与线程是什么意思
你说的核心与线程是常说的某CPU有4核心8线程中的意义吧,这个就要分开讲讲:
CPU核心
随着工艺的局限和频率的难以提升,CPU的性能不能再是无限制的往高频率的方向发展了,开始转向多核心的方向,简单地说,就是在一个物理内核里并列几个功能相同的核心,它们可以并行执行不同的任务进程,打个比方说,以前是一个人上夜班,现在是四个人上夜班,这就是所谓的CPU核心。
各个CPU核心都具有固定的逻辑结构,如一级缓存、二级缓存、执行单元、指令级单元和总线接口等逻辑单元等,CPU核心的进步对普通消费者而言,就是能以较低的价格买到性能较强的CPU。
但是,在多核CPU中,并不是所有的核心都是在全速满负载工作,可能有时内核会有所闲置,这样就有了Intel的超线程和AMD的多线程技术,把这些闲置资源利用起来。
线程
严格来说,线程(Thread)是操作系统能够进行运算调动的最小单位,作为进程中的实际运作单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程指的是在一个CPU核心上执行多个线程,或者多个任务,虽然在同一核心但是它们之间完全分离。
多线程可以用Temporal MultiThreading时间多线程和Simulate MultiThreading同步多线程来实现,具体细节这里就不讲了。
Windows 10下CPU的负载相当平均
对于单一核心而言,它能每秒钟处理成千上万条指令,但是在某一时刻只能够对一条指令进行处理,超/多线程技术能够在软件层变成将它变成两个逻辑处理器 ,同步并行处理更多指令和数据,它就是一种可以将CPU内部暂时闲置处理资源充分“调动”起来的技术。
我们对比测试过Core i7-6700K和Core i5-7600K,他们主要区别就在于超线程的有无和L3缓存的大小了,至于Skylake与Kaby Lake架构是没有性能上的差别的。
可以看到有超线程的Core i7-6700K其多线程性能比Core i5-7600K好19%左右。
所以,可以这么说,一个核心最少对应一个线程,通过超线程技术,一个核心可以对应两个线程。超线程技术是很好的提升核心利用率,将闲置处理资源充分调动起来,在操作系统中一颗物理CPU能当做多颗CPU来使用。当然要发挥出多核多线程的作用,还需要软件和操作系统的支持优化。
java 多线程是什么
线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。
Java的线程在操作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。
任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。
JVM以及操作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。
另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。
什么是Java多线程编程
一、 什么是多线程:
我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。
多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)
多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;
主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;
继承Thread类来实现多线程:
二、 Java中实现多线程的方式:
当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。
run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行
要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容
请点击输入图片描述
结果:
请点击输入图片描述
java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。
CPU的调用策略:
如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。
线程执行有两种方式:
1.抢占式:
目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。
2.轮循式;
每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。
希望对您有所帮助!~
Java多线程是什么意思
Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
在合适的地方启动线程如下:
2、实现Runnable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
3、使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问
java多线程是怎么回事
进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需要较小的系统开销。
Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。Java的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。
Java语言里,线程表现为线程类。Thread线程类封装了所有需要的线程操作控制。在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。一旦一个Java程序启动后,就已经有一个线程在运行。可通过调用Thread.currentThread方法来查看当前运行的是哪一个线程。
class ThreadTest{
public static void main(String args){
Thread t = Thread.currentThread();
t.setName(“单线程“); //对线程取名为“单线程“
t.setPriority(8);
//设置线程优先级为8,最高为10,最低为1,默认为5
System.out.println(“The running thread: “ + t);
// 显示线程信息
try{
for(int i=0;i《3;i++){
System.out.println(“Sleep time “ + i);
Thread.sleep(100); // 睡眠100毫秒
}
}catch(InterruptedException e){// 捕获异常
System.out.println(“thread has wrong“);
}
}
}
多线程的实现方法
继承Thread类
可通过继承Thread类并重写其中的run()方法来定义线程体以实现线程的具体行为,然后创建该子类的对象以创建线程。
在继承Thread类的子类ThreadSubclassName中重写run()方法来定义线程体的一般格式为:
public class ThreadSubclassName extends Thread{
public ThreadSubclassName(){
..... // 编写子类的构造方法,可缺省
}
public void run(){
..... // 编写自己的线程代码
}
}
用定义的线程子类ThreadSubclassName创建线程对象的一般格式为:
ThreadSubclassName ThreadObject =
new ThreadSubclassName();
然后,就可启动该线程对象表示的线程:
ThreadObject.start(); //启动线程
应用继承类Thread的方法实现多线程的程序。本程序创建了三个单独的线程,它们分别打印自己的“Hello World!”。
class ThreadDemo extends Thread{
private String whoami;
private int delay;
public ThreadDemo(String s,int d){
whoami=s;
delay=d;
}
public void run(){
try{
sleep(delay);
}catch(InterruptedException e){ }
System.out.println(“Hello World!“ + whoami
+ “ “ + delay);
}
}
public class MultiThread{
public static void main(String args){
ThreadDemo t1,t2,t3;
t1 = new ThreadDemo(“Thread1“,
(int)(Math.random()*2000));
t2 = new ThreadDemo(“Thread2“,
(int)(Math.random()*2000));
t3 = new ThreadDemo(“Thread3“,
(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}
实现Runnable接口
编写多线程程序的另一种的方法是实现Runnable接口。在一个类中实现Runnable接口(以后称实现Runnable接口的类为Runnable类),并在该类中定义run()方法,然后用带有Runnable参数的Thread类构造方法创建线程。
创建线程对象可用下面的两个步骤来完成:
(1)生成Runnable类ClassName的对象
ClassName RunnableObject = new ClassName();
(2)用带有Runnable参数的Thread类构造方法创建线程对象。新创建的线程的指针将指向Runnable类的实例。用该Runnable类的实例为线程提供 run()方法---线程体。
Thread ThreadObject = new Thread(RunnableObject);
然后,就可启动线程对象ThreadObject表示的线程:
ThreadObject.start();
在Thread类中带有Runnable接口的构造方法有:
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,Runnable target,
String name);
其中,参数Runnable target表示该线程执行时运行target的run()方法,String name以指定名字构造线程,ThreadGroup group表示创建线程组。
用Runnable接口实现的多线程。
class TwoThread implements Runnable{
TwoThread(){
Thread t1 = Thread.currentThread();
t1.setName(“第一主线程“);
System.out.println(“正在运行的线程: “ + t1);
Thread t2 = new Thread(this,“第二线程“);
System.out.println(“创建第二线程“);
t2.start();
try{
System.out.println(“第一线程休眠“);
Thread.sleep(3000);
}catch(InterruptedException e){
System.out.println(“第一线程有错“);
}
System.out.println(“第一线程退出“);
}
public void run(){
try{
for(int i = 0;i 《 5;i++){
System.out.println(“第二线程的休眠时间:”
+ i);
Thread.sleep(1000);
}
}catch(InterruptedException e){
System.out.println(“线程有错“);
}
System.out.println(“第二线程退出“);
}
public static void main(String args){
new TwoThread();
}
}
程序运行结果如下:
正在运行的线程: Thread[第一主线程,5,main
创建第二线程
第一线程休眠
第二线程的休眠时间:0
第二线程的休眠时间:1
第二线程的休眠时间:2
第一线程退出
第二线程的休眠时间:3
第二线程的休眠时间:4
第二线程退出
本文相关文章:
24小时天气预报(天气预报24小时高温是什么意思呀,24小时低温又是什么意思)
2024年9月10日 03:55
choose是什么意思(choose是什么意思 choose解释)
2024年9月9日 12:35
chest是什么意思中文 chest的意思?chest是什么意思中文翻译
2024年9月6日 17:41
12月29日蚂蚁庄园答案(蚂蚁庄园今日答案惊蛰的蛰是什么意思)
2024年9月2日 01:30
cdkey兑换码领取(cdkey是什么意思cdkey怎么领取)
2024年8月30日 23:21
disabilities是什么意思啊(disability是什么意思)
2024年8月12日 14:15
更多文章:
软件架构师好考吗(请问四年内做软件架构师可能性大不大 要遵循什么步骤 怎么学习 有什么书籍推荐)
2024年7月22日 20:13
vscode配置python(mac下VScode怎么配置编译Python)
2024年8月11日 06:07
欧盟酝酿新一轮对俄制裁(欧盟又双叒对俄罗斯下手了!对俄原油限价令,会导致什么后果)
2024年6月9日 04:53
自定义工作流引擎(求推荐一款软件,能自定义工作流程,且关联上库存管理)
2024年5月2日 09:43
什么软件可以无缝切图(把4张图p在一起的无缝p图是什么软件)
2024年7月9日 10:45
为了CTF比赛,如何学习逆向和反汇编?怎样可以快速学会反汇编分析
2024年6月26日 15:33
关系数据库的三种基本运算(关系数据库管理系统的3种基本关系运算是什么)
2024年5月18日 07:11
fedora14(fedora14 可以在终端输入命令,但是鼠标点什么都没用)
2024年7月23日 12:44
源代码下载安装(hadoop的源代码怎么下载应该下载哪一个文件不知道选择那个)
2024年6月28日 16:45
countcolor(Excel countcolor函数怎么用)
2024年5月28日 09:02