线程,进程以及Java中创建线程的多种方式

news2024/9/27 19:23:08

1. 前言

今天的这篇文章的目的还是为了讲述下什么叫线程,什么是进程。可能之前很多人都是通过背书得来的,今天就从通俗易懂的角度来分析下

2. 适合人群

  • 线程以及进程的初学者

3. 开始

3.1 什么是程序

  1. 其实不管是程序/ 进程/ 线程都是基于操作系统而言的。
  2. 对于操作系统而言的话,程序就是一个后缀为exe或是msi的可执行文件,当我们点击执行文件的时候,会将文件内容加载到操作系统的内存中,同时也是开辟一块空间来保存执行文件
  3. 程序好比一个js文件,操作系统好比是浏览器。一个执行以及被执行的关系

在这里插入图片描述

3.2 什么是进程

先来揭晓下答案:进度是资源分配的最小单位

其实并不是把执行文件加载到内存总就完事了,而是会安排进程进行资源分配。比如分配端口号,网络等。所以进程是资源分配的最小单位

3.3. 什么是线程

先揭晓答案:线程是调度执行的最小单位

虽然已经将程序加载到内存中了,同时也是给程序分配资源来,但是并不是靠进程来执行。 其实我们还是靠主线程来执行程序的

所以其实可以理解为线程就是一条执行路径。可能一个事情的完成需要多个线程来完成。这就是所谓的多线程

在这里插入图片描述
在这里插入图片描述

3.4 QA

解释下面的问题的时候,我们需要知道什么是CPU密集型处理。 就是完成功能的大部分处理是需要CPU来完成的,比如计算等。当然IO 相关的不算啊。

3.4.1 单核CPU设置多线程有意义吗

  • 在某种程度上是有意义的
  • 场景1:如果用户多个任务都是需要密集型计算的话,那么对于单核CPU而言的话,只能一个一个执行了。因为所有的计算都依赖此唯一的CPU来完成。这种其实多线程没有意义
  • 场景2:同样用户需要完成多个任务,但是一个任务等待IO输入输出的,一个任务是CPU密集型的。这个时候其实一个线程等待外部设备输入交互。另一个线程来进行计算。通过系统控制线程切换来完成。 这种情况下 是存在意义的

3.4.2 一定是线程越多越好吗

我们使用遍历10亿的数字来做一个实验,看看是不是线程开辟越多越好呢

  • 通过单线程来执行
    在这里插入图片描述
  • 通过多线程来执行

在这里插入图片描述

通过上述实例得知,并不是线程开辟越多越好的。因为线程的切换同样需要时间。但是最合适的办法是经过不断的压测来得出结论才是最真实的

3.4.3 有没有啥公式可以套用呢???

还真有,虽然套用的公式也是前人经过无数次的实验总结的,但是个人还是感觉应该经过自己压测实践最好了。不过公式该给出还是应该给出的

在这里插入图片描述

3.5 创建线程的多种方式

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("这是创建线程的一种方式:通过继承来实现");
    }
}

class MyRun implements Runnable {
    @Override
    public void run() {
        System.out.println("这是创建线程的一种方式:通过实现接口来实现");
    }
}

class MyCall implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("这是创建线程的一种方式:通过实现接口Callable来完成");
        return "success";
    }
}

public class Thread_02_CreateThread {

    @Test
    public void test() throws ExecutionException, InterruptedException {
        // 线程的创建方式1
        new MyThread().start();
        // 线程的创建方式2
        new Thread(new MyRun()).start();
        // 线程的创建方式3
        new Thread(() -> {
            System.out.println("这是创建线程的一种方式:通过lambda表达式创建");
        }).start();
        // 线程的创建方式4
        FutureTask<String> futureTask = new FutureTask<>(new MyCall());
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println(futureTask.get());

        // 线程的创建方式 5
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            System.out.println("这是创建线程的一种方式:通过线程池来进行创建");
        });

        Future<String> submit = executorService.submit(new MyCall());
        System.out.println(submit.get());
        executorService.shutdown();
    }

上述代码是Java中创建线程的几种方式

3.5.1 继承ThreadRunnable 哪个好呢???

  • 总体而言的话是Runnable 会更好点。因为在Java中是单继承,多实现。如果我们开发中继承了Thread就不能继承别的类的。但是我们可以实现多个接口
  • 可能唯一有遗憾的就是 这些继承或是接口 都是没有返回值的

3.5.2 如果想要返回值呢???

如果想线程有返回值的话,可以继承接口Callable 来指定返回值

3.5.3 如果想写法简单点呢???

如果只是想在线程内做一些操作的话,对返回值无要求,同时想要写法简单点,可以使用上述代码中的lambda来完成线程的创建

4. 结束

以上是对程序/ 线程/ 进程的理解。以及在Java中创建线程的几种方式。源码请参照. 如果大家觉得对自己有用处的话,希望大家点赞,收藏。多多关注小编哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

141.环形链表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

SuperMap iDesktop地质体模型匹配地形——精修地质体模型路线

作者&#xff1a;超图研究院技术支持中心-于丁 地质体模型匹配地形——精修地质体模型路线 相信大家开展地质体业务时&#xff0c;常常会遇到构建的精模地质体与DEM地形数据的交界面&#xff0c;嵌合效果不佳、相互压盖、渲染冲突不稳定&#xff08;闪面&#xff09;、掩盖、漂…

前端期末考试试题及参考答案(03)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 transition属性中______规定应用过渡的CSS属性的名称。transition属性中______定义过渡效果花费的时间。transition属性中______属性规定过渡效果的时间曲线。…

GitHub入门指南(上)

前言 我去年入门 GitHub&#xff0c;一开始不知道从哪开始学&#xff0c;在网上查找了很多文章、教程学习。这篇文章就是以我刚学习时的小白视角写的&#xff0c;希望能帮助到想开始学习 GitHub 又不知如何上手的学习者。因为我也是初级水平&#xff0c;文中介绍的知识基于我自…

6.移动端布局-rem布局

1.rem基础 优点&#xff1a;可以通过修改html里边文字的大小来改变页面中其他元素的大小&#xff0c;可以实现整体控制 1.1 rem单位 rem(root em)是一个相对单位&#xff0c;类似于em。 em是相对于自身元素字体大小&#xff08;若自身没有设置font-size则基础父元素的字体大…

一次SQL调优 聊一聊 SQLSERVER 数据页

一&#xff1a;背景 1.讲故事 最近给一位朋友做 SQL 慢语句 优化&#xff0c;花了些时间调优&#xff0c;遗憾的是 SQLSERVER 非源码公开&#xff0c;玩起来不是那么顺利&#xff0c;不过从这次经历中我觉得明年的一个重大任务就是好好研究一下它&#xff0c;争取在 SQLSERVE…

uniapp实现音频播放抢占系统音频焦点

项目为使用uniapp框架开发的Android/iOS APP应用 实现功能需求 假设手机正在播放音乐&#xff0c;当前APP处于前台收到消息&#xff0c;需播放提示音提示用户。目标为降低后台正在播放音乐的音量&#xff0c;播放提示音&#xff0c;播放完毕后恢复后台音乐音量 需求分析 乍…

拉伯证券|新能源汽车前11月产销翻倍,渗透率升至三分之一

2022年11月&#xff0c;国内新能源轿车渗透率已升至33.8%&#xff0c;创前史新高。 2022年的最终一个交易日早盘&#xff0c;两市高开高走&#xff0c;沪指涨0.61%&#xff0c;深证成指涨0.35%&#xff0c;创业板指涨0.3%。板块上来看&#xff0c;Web3.0、虚拟人、网络游戏概念…

BI技巧丨RankxYoY

群友&#xff1a;PowerBI可以实现两年的排名差异么&#xff1f; 白茶&#xff1a;可以&#xff01;安排&#xff01; 本期的问题&#xff0c;来自于群内小伙伴的一个实际应用场景。在实际业务中&#xff0c;这个需求属于常见类型&#xff0c;展示当前排名时&#xff0c;用户关注…

【软件测试】 测试开发?看看一线大厂需求的测试开发技能......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 能在一线大厂工作是…

FPGA知识汇集-FPGA系统时序理论

时序约束条件 下面来具体讨论一下系统时序需要满足的一些基本条件。我们仍然以下图的结构为例&#xff0c;并可以据此画出相应的时序分析示意图。 在上面的时序图中&#xff0c;存在两个时序环&#xff0c;我们称实线的环为建立时间环&#xff0c;而虚线的环我们称之为保持时间…

Java死锁

一.死锁是什么&#xff1f; 死锁指两个或者两个以上的线程在执行过程中&#xff0c;去争夺同样一个共享资源&#xff0c;造成的相互等待的现象&#xff0c;如果没有外部干预&#xff0c;线程会一直阻塞&#xff0c;无法往下执行&#xff0c;这样一直处于相互等待资源的线程叫做…

极米Z6X Pro怎么样?极米Z6X Pro亮度如何?极米Z6X Pro值得入手吗?

投影仪不知怎么选&#xff1f;不妨看看极米Z6X Pro&#xff0c;半山黛青的全新配色下&#xff0c;是仅有5.3cm的轻薄机身&#xff0c;1.4kg的重量&#xff0c;一只手就可以轻松拿取。相比同价位的投影产品&#xff0c;极米Z6X Pro摆放方便又不占地&#xff0c;外观时尚精致&…

Go Map

Go Map map 是一种key-value的键值对存储结构&#xff0c;其中key不能重复&#xff0c;无序。底层是hmap结构&#xff0c;hmap中维护buckets(bmap结构)。结构定义 type hmap struct {count int // 元素个数B uint8 // buckets已扩容的次数&#xff0c;buckets长…

JVM-Java内存区域

1、运行时数据区域 运行时数据区域&#xff1a;程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。 非运行时数据区域&#xff1a;直接内存。 &#xff08;1&#xff09;程序计数器 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制。在多线…

谷歌2022年最受欢迎Chrome浏览器扩展程序:包含Tango,Compose AI等

根据截图排序从左到右依次介绍如下&#xff1a; RoPro&#xff1a;Roblox.com网站体验增加了许多有用且独特的功能&#xff1b; MyBib&#xff1a;自动创建 APA 样式、MLA 格式和哈佛引用样式引文&#xff1b; eJOY English&#xff1a;翻译自Netflix, Youtube, iFlix上的字…

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A-D)

Codeforces Round #841 (Div. 2) and Divide by Zero 2022&#xff08;A-D&#xff09; 题目链接限制AJoey Takes Moneystandard input/output1 s, 256 MBBKill Demodogsstandard input/output1 s, 256 MBCEven Subarraysstandard input/output2.5 s, 256 MBDValiant’s New M…

数字经济指标构建-各省、地级市匹配上市公司数据、城市数字化指数

一、中国城市数字经济指数2017-2022年&#xff08;数据代码报告&#xff09; 中国城市数字化指数全面覆盖城市数字化规划、建设、运营的各个方面&#xff0c;能够有效评估城市各个领域的数字化建设水平和运营效果。 全国城市数字经济发展热图 数据来源&#xff1a;中国城市数字…

语音转换之CycleGan-VC2:原理与实战

非平行语音转换CycleGAN 之前学习了传统统计学习里的经典的语音转换模型GMM。随着深度学习的发展&#xff0c;出现了更好的语音转换方法&#xff0c;今天学习较为经典的CycleGan。 平行语音转换一般流程 典型代表就是基于GMM的语音转换。平行数据就是说源语音和目标语音一一…

矢量图斑局部狭长判断和定位局部狭长部分(PostGIS、Java、C#实现)

矢量数据在数据采集过程中由于数据处理导致出现局部狭窄的面状部分&#xff0c;如下图 1. 定义和解决方法 狭长结构是指图斑几何形态上窄而长的部分,符号化后出现图形粘连压盖现象,导致难以在图面上清晰地表达出来。因此,依据地图表达比例尺因素需要对狭长结构进行融解处理。在…