线程的介绍

news2024/12/26 11:32:59

首先我们来了解一下线程是什么:

首先我们介绍一下程序是什么?程序就是我们编写的代码就叫程序,当我们程序运行的时候则称为进程,在我们现实生活中哪些用到了进程,就比如说我们qq,微信,百度网盘等等软件的使用,当它们在运行的时候,操作系统就会自动的给它们分配内存空间,那线程是什么,线程是由进程创建出来的,是进程的一个实体,一个进程可以拥有多个线程,线程分为两种一个是单线程,还有一个多线程。

单线程:同一时刻,只允许运行一个线程。

多线程:同一时刻,允许运行多个线程,比如qq,微信可以打开多个聊天框,百度网盘可以同时下载多个文件。

接下来我们来介绍两个新的概念:并发和并行

1.并发:同一时刻,多个任务交替执行,但是交换的速度会非常快,让我们感觉是在一块运行的一样,简单来说就像我们的大脑,在我们同时做多件事的时候大脑是迅速的来回切换的,单核cpu实现的多任务就是并发。

2.并行:同一时刻,多个任务同时进行,每个任务都有单独的cpu来执行,即多核cpu实现的多任务就是并行。

接下来我们就要来了解一下线程的使用方式:

首先我们来看一下体系图:

这里我们可以得出创建线程的方式应该有两种:

一个是继承Thread类,还有一种就是实现Runnable接口。

我们先看一下继承Thread类的使用方法:

我们先来看一下实例代码:

public class ift{
    public static void main(String[] args) {
        Preson2 preson1 = new Preson2();
        preson1.start();
    }
}

class Preson2 extends Thread{
    int times= 0;
    @Override
    public void run(){
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("hello" + (times ++));
            if (times == 20){
                break;
            }
        }
    }
}

当我们继承Thread类的时候,我们必须要重写run()方法,否则的话,就会出现报错,但是我们在main方法中,发现我们创建对象之后并没有调用run方法而是调用了start()方法,这里我们来做一个解释,并且对源码进行分析:

当我们调用start()方法的时候我们发现代码自动的调用到了start0()这个方法中,其实start0方法才会调用run()方法,但是它是如何调用的,这个调用过程我们是无法看到的,简单来说是start0()方法调用虚拟机,jvm就会自动的调用run()方法,底层是通过C/C++实现的,所以当我们执行start()方法的时候run方法就会被自动调用,但是run()方法并不是启动线程的方法,它只是编写了线程该执行任务,真正启动线程的还是start()方法(感兴趣的可以Degbug源码),接下来我们来看一下代码的运行示意图:

public class ift extends Thread{
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Preson2 preson1 = new Preson2();
        preson1.start();
        int time = 0;
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("hi~" + (time ++));
            if (time == 10){
                break;
            }
        }
    }
}

class Preson2 extends Thread{
    int times= 0;
    @Override
    public void run(){
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("hello" + (times ++));
            if (times == 5){
                break;
            }
        }
    }
}

这里我们发现主线程调用start方法后它是不会停止运行的,而是和子线程交替运行,只有两个线程的任务全部结束,才会退出程序。

第二种实现Runable接口的方式。

总所周知,Java的继承是单继承的方式,但是如果我们的类已经继承了其他父类这种情况我们就需要使用我们的接口来实现。

实际案例:

这里我们发现当我们实现Runable接口后我们的start()方法就无法使用了,那我们该如何启动线程,我们来演示一下:

这里我们相当于把它放在一个线程里包装一下,之后就可以使用start()方法。

我们来模拟一下start()调用过程:

class ThreadProxy implements Runnable {//你可以把 Proxy 类当做 ThreadProxy
    private Runnable target = null;//属性,类型是 Runnable
    @Override
    //这里就是一个模拟的一个run()方法,首先判断传入的对象是否为null,不为null的话就会直接调用传入对象的run()方法。
    public void run() {
        if (target != null) {
            target.run();//动态绑定(运行类型 Tiger)
        }
    }
    //我们创建线程调用的构造器,传入一个实现接口Runable的对象
    public ThreadProxy(Runnable target) {
        this.target = target;
    }
    //当我们调用start()方法的时候自动调用start0()方法
    public void start() {
        start0();//这个方法时真正实现多线程方法
    }
    //start0()会调用run()方法
    public void start0() {
        run();
    }
}

大概就是这么个意思,线程的其他具体内容后面再继续写。

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

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

相关文章

兼容性测试:确保系统在各种环境中正常运行

随着数字化时代的到来,软件应用在不同的设备、操作系统和浏览器上运行的需求变得日益重要。为了确保用户体验的一致性和系统的稳定性,兼容性测试变得至关重要。本文将介绍如何使用兼容性测试,以保证软件在各种环境中无缝运行。 1. 确定目标平…

ssl证书问题导致本地启动前端服务报500

报错如下:注意查看报错信息 问题:系统原是http,后台调整为https后,ssl证书有点问题, vue项目本地服务,使用代理,webpack默认,证书强校验,导致请求无法发出,后…

Linear classifiers——线性分类器

1.(Generalized) Linear classifiers——广义线性分类器 1.1 模型 假如有两类数据,类别标签为y 1和y -1 我们可以使用一个线性函数将其分类,二维形式 通常x增加一个恒等于1的维度,可以将b合并进w,于是更一般的形式为 ,就相当于…

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 ,操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

C++使用UDP

C使用UDP 对C使用UDP做了简单封装&#xff0c;可直接运行 头文件udp.h #pragma once #include <Winsock.h> #pragma comment(lib,"WS2_32.lib")#define LOCAL_IP_ADDR INADDR_ANY //当前应用程序接收的IP地址 #define LOCAL_PORT 9527 …

PixPin带有截图/贴图/长截图/文字识别/标注的截图工具,很好用

官网地址&#xff1a;PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 确实挺好用的&#xff0c;推荐一下

UE4 实用材质图形

渐变圆 光晕效果&#xff1a; 十字光晕&#xff1a;

1840_emacs org-mode babel的语言支持

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 1840_emacs org-mode babel的语言支持 主题由来介绍 Babel是org-mode中支持文学式编程以及可重现研究的一个核心模块&#xff0c;之前看过这个插件的优点是功能完善且支持的语…

本地运行大语言模型并可视化(Ollama+big-AGI方案)

目前有两种方案支持本地部署&#xff0c;两种方案都是基于llamacpp。其中 Ollama 目前只支持 Mac&#xff0c;LM Studio目前支持 Mac 和 Windows。 LM Studio&#xff1a;https://lmstudio.ai/ Ollama&#xff1a;https://ollama.ai/download 本文以 Ollama 为例 step1 首先下…

在datagridview列显示下拉操作

DataGridViewComboBoxExColumn 设定好类型 需要设置的地方是&#xff1a; 绑定数据的操作&#xff1a; 因为此处绑定数据实际为数据 参数 显示的操作&#xff0c;不影响datasource的数据绑定 下一步 数据绑定&#xff1a; DGVCOrderZhuangtai.ValueType typeof(EOrderZhuan…

条件概率密度

设二维随机变量的概率密度为&#xff0c;关于的边缘概率密度为。若对于固定的&#xff0c;有&#xff0c;则称为在条件下的的条件概率密度&#xff0c;记为&#xff1a;

产业元宇宙推动内容供应链:元宇宙产业对企业商业性的影响

随着科技的迅速发展和创新&#xff0c;元宇宙产业已经成为全球关注的热点话题。元宇宙是一种虚拟的数字世界&#xff0c;通过各种技术和设备&#xff0c;人们可以在其中创建、体验和互动&#xff0c;为企业提供了前所未有的商业机会。本文将探讨产业元宇宙如何推动内容供应链&a…

函数和函数表达式

我们先来看三个式子 1️⃣ yf(x) 2️⃣ f(x)2x1 3️⃣ y2x1 先来明确一下概念&#xff0c;这三个式子的&#x1f7f0;两边总共有3种表达形式 y是函数最终输出的值f(x) 是整个函数运算过程2x1是具体的表达式 那么这三个式子分别是什么意思呢&#xff1f; yf(x)是对函数关系的…

【leetcode】链表总结

说明&#xff1a;本文内容来自于代码随想录 链表基本操作 https://leetcode.cn/problems/design-linked-list/ 删除节点 https://leetcode.cn/problems/remove-linked-list-elements/description/&#xff0c;删除节点&#xff0c;虚拟头节点。定义两个节点&#xff0c;分别…

服务器数据恢复—raid5热备盘未激活崩溃导致上层oracle数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X系列服务器&#xff0c;4块SAS硬盘组建了一组RAID5阵列&#xff0c;还有1块磁盘作为热备盘使用。服务器上层安装的linux操作系统&#xff0c;操作系统上部署了一个基于oracle数据库的OA&#xff08;oracle已经不再为该OA系统提供后续服务…

域名、DNS 和 IP是什么?网站搭建的必备知识,一文搞定

在正式进行WordPress站点搭建前&#xff0c;有一些最基础的知识是必备的&#xff0c;这篇文章会详细介绍给大家。 一、域名、DNS和IP的关系 域名、DNS和IP是互联网上的三个重要的概念&#xff0c;它们之间有着密切的联系&#xff0c;也影响着我们访问网站的方式和效果。接下来…

GPM降水数据下载-Linux系统上使用wget

Linux 上如何下载GPM降水数据 图片来自&#xff1a;https://disc.gsfc.nasa.gov/datasets/GPM_3IMERGHHL_06/summary?keywordsGPM 这里以GPM30min降水数据为例&#xff0c; GPM下载链接 如果进不去&#xff0c;可能需要在这个网址上先注册个账户&#xff0c;这里不做介绍。 …

【C语言】printf()函数详解,手把手教你,保姆级!!!

目录 基本用法 printf()函数--占位符 占位符大全 printf()函数--限定宽度 printf()函数--正负--限定小数 printf()函数--输出部分字符串 总结 【C语言】printf()函数详解&#xff0c;手把手教你&#xff0c;保姆级&#xff01;&#xff01;&#xff01; 基本用法 printf()…

物联网终端设备众多,为何遥测终端机备受瞩目?

遥测终端机是一种用于数据采集、远程传输、数据存储与处理的综合体设备&#xff0c;已逐渐成为现代智能物联领域的焦点。遥测终端机集成了多种传感器与通信模块&#xff0c;能够实时采集各种环境参数&#xff0c;如温度、湿度、压力、流量等&#xff0c;同时支持无线通信&#…

c语言->浅学结构体

系列文章目录 文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,函数,指针-CSDN博客 目的&#xff1a;学习结构体基础内容&am…